我们认为,数组型结构和树型结构都可以看成线性表型结构的推广,而哈希表的散列型结构又是数组型结构的推广。为什么这么说呢?
在线性表中,无论是链表、栈还是队列,每一个元素在空间位置上与其前后的元素构成关联;在数组中,每一个数据在空间位置上都与首元素构成关联,索引的本质含义是元素与首元素的偏移量;在树结构中,每一个数据在空间位置上都与其上下层的元素构成关联。
因此,与线性表相比,数组将所有元素相互依赖的递归结构转换为所有元素具有相同基准的结构,从而实现了基于索引的快速随机访问;树将元素间一对一的关系推广为一对多的关系,从而实现了数据****结构的层级。
上述有序结构中,能够衍生出无序结构的只有数组。在本系列讲解数组的文章中,提到了我们会基于日常经验将“索引”理解为“编号”的问题,这实际上就是散列的思想。因为元素一旦具有唯一的“编号”,我们定位元素时的思考角度就不再是谁在谁的前面或后面,而是那个元素的“编号”是多少。
“编号”与元素之间是**映射(Map)的关系,这很像字典(Dictionary)**的检字法。正因为数组中索引与元素具有映射关系,所以把索引看成编号是没有毛病的。编号可以有序,也可以无序。比如下面的Python代码定义的列表(相当于数组)和字典(相当于哈希表):
# 定义一个 列表(数组)
list_1 = ['赵', '钱', '孙', '李']
# 定义一个 字典(哈希表), 键-值 为上述列表的 索引-元素
dict_1 = {0:'赵', 1:'钱', 2:'孙', 3:'李'}
# 再定义一个 字典(哈希表),键-值 为 拼音首字母-汉字
dict_2 &