# 数据结构是什么?
说到数据结构,学过的同学一定知道:数组、链表、栈、队列、树、图。
但为什么要有这些数据结构,他们是用来解决什么问题呢?各数据结构只间有什么关联吗?数据结构有优劣之分吗?这是我在大学学习的时候所没有思考过的问题。
因此我带着这些问题进行了思考,有了这篇文章,希望用通俗易懂的语言来表述,希望能够给你带来一些帮助。
# 为什么要有数据结构,他们是用来解决什么问题呢?
在计算机的世界里,盘古开天劈地时,“数据”是他们的公民,“数据”都是以 0 和 1 进行组合表示的,在一个村子里,从村头安排住处,一个接一个的住在一起。当生活了一段时间后,发现了几个问题:找“数据”、搬走/搬入比较麻烦。
- 找“数据”:想在村子里找某个“数据”,但一头雾水,不知道从何找起
- 搬走/搬入:当某个“数据”搬走不住了,需要把他家空出来,空出来的地方怎么处理呢?有人要搬进来,把他安排到哪里呢?
要解决上面的问题,就有了 数组、链表、树 等解决方法。
# 数组的解决方法
找“数据”
数组的找“数据”方式要求,每家每户必须连续,即一家挨着一家,且每家占地面积一致,这样上一家到下一家的距离一致(我们这里用步数来表示距离)。因此人员簿上就记录第一家的位置。
现在我们开始找“数据”,假设这个村子有 10 户人家,每家需要走 10 步路。我们要找“C数据”。
第一次寻找(对应遍历查找想要数据):我们就从村头,挨家挨户的去找,找到第 3 户找到了“C数据”,我们就不继续往下找了。因此我们知道了“C数据”住在第 3 户。
第二次寻找时,我们就不需要再挨家挨户去找了,二是直接通过 (3 - 1) * 10 步 = 20步,就可以直接从村头走 20 步 找到“C数据”了。
搬走/搬入
数组处理搬走的情况时,是强迫要求搬走的那一户后面所有的人,都依次往前搬一户,来保证连续性。而搬入则是要求,从搬入“数据”想住到位置开始,“数据”都往后挪一户给新来的让位置。所以数据的解决方案适合村里的“数据”都比较好讲话,脾气比较好,且不会来回搬迁,不然谁也受不了来回搬迁啊。
所以最后我们发现,数组的方式比较擅长找“数据”,而不擅长搬走/搬入。
# 链表的解决方法
找“数据”
链表的找“数据”方式,不要求每家每户住在一起,也不要求每家占地面积一样大,那他是怎么找“数据”的呢?
链表要求,每户人都要记住,从自己家到另一家的路线。所以每家都要有个记录下家路线的簿子。因为这种方式像一个链条一样一环接一环,所以称为链表,十分的形象。这个链可以是一条直线(每家都记自己邻居的路线),也可以是扭曲的线(每家记录的不是自己邻居的路线)。
因为这种方式,每次找人的方式都一样,都要从村头第一家开始找(循环遍历),根据路线一家一家找,直到找到为止。
搬走/搬入
链表处理搬走/搬入的方式非常有意思且高效。
当有“数据”搬入时,找一块空地盖房子就行了,假设一个村子的链表为:a -> d -> b -> c ...,新来的f想夹在 d 和 b 之间,那么只需要:把 d 家里的薄子给 f,然后 d 在写一个新薄子记录 f 家的地址就可以了。
当有“数据”搬走时,假设一个村子的链表为:a -> d -> f -> b ...,f 要搬走,首先需要通过链表找到 d,发现他的下家是 f,然后把 f 的薄子拿过来,然后把自己家的薄子扔掉就好了
以上我们发现,链表的方式不擅长找“数据”,但比较擅长处理搬走/搬入事宜。
# 树的解决方法
树的解决方法和链表很像这里就留给读者自己思考一下吧。
# 各数据结构只间有什么关联,有优劣之分吗?
经过上面的讲述,我们发现,数据结构就是为了方便找数据和处理数据搬走/搬入的解决方案。
数据结构的发展有一个发展路线,数组是一种较早出现的数据结构。数组的概念在数学和计算机科学中都很早就存在,并且在早期的计算机编程中就被广泛使用。后来人们应该是发现数组的缺点,然后发明出了链表的概念。
但目前来说没有一种十分完美的数据结构来解决查找、搬走、搬入的问题。他们之间也没有优劣之分,要结合不同“村子”的情况来选择最适合的解决方法(数据结构)。
希望在以后能发明出一个完美的数据结构,这样我们就不用再学这么多数据结了...