数据结构之表
表分为链表与数组,这里我们打一个奇妙的比喻:
你是一个《jojo的奇妙冒险》的粉丝,你很喜欢这部漫画,于是决定入实体,假设你入了第六部《石之海》而且你还坚守信仰选择了正版。这不是一个小数目而你正好在读高三,嗅见了妈见打的气息的你选择了躲避。你从床下拖出了一个大小刚好合适的(没错就是这么巧)箱子把这一套书放了进去。你很满意,因为每次打开箱子你可以很迅速的找到想要的第几本书。然而过了不久,你看完了《石之海》于是你又去买了第七部《飚马野郎》,可是这次你又没有箱子了,于是你又想出了一个办法,你在箱子底下贴了一张字条告诉自己第一本放在了被挖空的黑皮字典里,而第一本的背后你又写上了藏第二本的位置,以此类推。于是你完美地利用家里的犄角旮旯藏好了这套书。你很满意,只是但你想回顾一下前面的书时会有一些麻烦,你要从第一本开始找起。过了一段时间,你决定按顺序将能放在一起的书放在一起以提高查找的速度。
必须声明的一点是用比喻来描述一个事物的某些特性是很棒的,但难免在描述其它性质时原来的喻体没什么意义,甚至相左。
现在我解释一下,数组的使用方法就像是存放《石之海》的方法,我们将数据按顺序放在一起,而这带来的是我们在使用数组前必须估计并声明数组的大小,一般会选择估计大一点因为数据如果过多(数组越界)会威胁到别的数据的安全。数组的优势在于查找时间是常数,但是数组插入和删除数据需要线性时间(因为所有数据都紧贴在一块),在最坏的情况下由于插入了过多数据可能数组越界,只能再申请一个大的数组。所以简单的数组一般不用来实现表这种结果(没错,这语气应该存在复杂的数组)。
而链表的使用方式就像存放《飚马野郎》的第一种方法。数据是不连续存储的,可以很好地利用空间而不像数组可能浪费空间。每个数据都接着一个指针指向下一个元素。链表可以在常数时间插入和删除,但是查找花费线性时间。
可以看到数组和链表的优缺点正好相对,因此可以将链表和数组结合使用,比如链表中的每一个节点都变成一个数组(正是《飚马野郎》的第二种存储方式),这样做要看具体的情况咯,可能你汲取两者的优点,但也可能汲取了全部缺点。
欢迎评论😀