数据结构中有两种存储结构很容易搞混,那就是索引存储结构和散列存储结构(哈希存储结构)。
根据地址就可以找到对应的关键字。可以理解成一个黄页,你根据一个人的名字,就可以找到他的电话。所以索引存储又被称为直接寻址。 数组就是一个常见的索引存储结构,可以通过下标来直接访问,下标(也就是关键字和地址相关)
“散列存储”名字中的“散列”就是常听到的 hash(哈希值),hash 是通过一种算法来运算出来的,比如 MD5。在这种存储格式下,地址会通过 hash 算法来运算成一个相同长度的 hash 值,然后存放这个 hash 值,而不是直接存放地址。在访问关键字的时候会通过运算解码 hash 值,然后再访问。这个时候,节点的存储地址和关键字是有某种映射关系的。
二者区别可以说就是多了一个 hash 函数运算的过程。但是为什么要多这一步操作,而且还会“浪费”计算机的性能呢?
答案是节省空间。
因为计算机的存储空间是有限的,如果不考虑存储空间的限制,那么可以创建一个字典,为每个可能的关键字保留一个位置,然后通过索引直接寻址。
但是在一些情况下,实际存储的关键字数目往往比可能的关键字数目要少很多很多,就造成了巨大的空间浪费。如果这时候使用散列存储来替代索引存储。例如散列表使用一个长度与实际存储的关键字数目成比例的数组来存储,访问的时候将哈希值转换成对应的下标。
散列技术还有一个好处就是有优异的平均情况性能,而且在关键字集合是静态的时候,散列技术也可以提供出色的最坏性能。
在时间复杂度上,完全散列(perfect hashing)和基本的字典操作所需的都是O(1)的时间,也就是说,并没有太大时间上的区别。
而且二者有时还需要混用,所以区别不大。
不过有些人需要考试,考试里会出现相关题目,只要记得散列存储结构的存储地址和关键字存在某种映射关系即可。
希望可以帮到有需要的人~