【数据结构基础】散列表存储

基础概念

       和顺序表一样,散列表也是用来存储数据的;和顺序表不同的是,散列表优化了查找数据的操作,使得在对通过散列表进行存储的数据进行查找的开销大大降低。在散列表中,我们用键值指代我们需要进行保存的数据,用散列地址表示存储的位置,用散列函数指代通过键值确定存储位置或者通过存储位置确定键值的映射关系(散列)。

构造方法

       我们在进行散列函数的构造时,需要考虑将需要存储的数据均匀的分配到存储地址中,避免出现冲突。冲突是两个及两个以上的数据的存储位置相同的一种现象,这些相同的数据我们称之为相对于该散列函数的同义词。下面简单介绍几种常用的构造方法供大家参考。

除留余数法

       除留余数法就是选取一个不大于表长的数值p做被除数,然后将带存储的数据依次除以这个数值p,取运算的余数作为该数值在散列表中的存储位置。这种方法产生冲突的原因是p值选取的不恰当,使得存储数据中一个以上的数据除以p后产生的余数一样,导致存储位置相同。一个比较好的解决办法是在选取p值时,要选取小于表长的最大质数,这样能把余数相同的风险降低到最小。

平方取中法

       顾名思义,该方法就是先求得待存储数据的平方值,排序之后然后选取中间的平方值作为p值。这种方法通过用乘法替代除法,以提高CPU的效率(但是现在感觉不出来CPU处理乘除法的效率差了)。这种方法适用于数值分配比较平均的情况。

冲突解决

再探测

线性

       对查找位置的index进行处理,进行诸如+1、-1、+2、-2的操作。

随机再探测

       在查找位置的index周围随机进行再次查找。

再哈希

       发生冲突时,采用另外一种映射方法进行查找。

链地址法

       将所有关键字为同义词的数据元素存放在同一线性链表中,借助指针将产生冲突的数据元素放在同一个指针所指向的链表中,从而起到保持同义词在同一线性表中按关键字进行有序排列。

公共溢出区法

       建立一个公共缓冲区,将有冲突现象的关键字都存储在缓冲区内。在查找的结果为具有冲突的关键字时,就进入缓冲区进行查找。

小结

       以上就是我对散列表的理论理解了,后续学习中补充相应的实践代码。
感谢您的宝贵时间,祝生活愉快,谢谢~
    ——joker

你可能感兴趣的:(【数据结构基础】散列表存储)