数据结构哈希表在查找中的使用

版权声明:原创文章仅供大家学习使用,严禁转载 https://blog.csdn.net/qq_41809589/article/details/86575724

哈希表的原理是将全部数据通过某个函数来确定独特的一个存储位置,在查找某个数据时通过该函数来直接得到该数据的存储位置。所以在理想情况下该种查找方法的期望时间为O(1)。
冲突是哈希表使用过程不可避免的存在,在数据较为庞大时,通过固定的一个函数转换很可能得到相同的结果,就发生了存储位置的冲突。所以在哈希表使用中最重要的就是函数的选取和冲突的解决方法。
冲突的频繁程度除了与h相关外,还与表的填满程度相关。设m和n分别表示表长和表中填入的结点数,则将α=n/m定义为哈希表的装填因子。α越大,表越满,冲突的机会也越大。
如图,在存储如下数据时,通过函数的适当改变是可以解决一定数量的冲突的。
在这里插入图片描述
哈希函数----除留余数法
这是在存储简单数据时常用的一种方法,关键字被某一个不大于哈希表长度m的最大素数p除后所得的余数为哈希地址,即 h(key)=key%p。

处理冲突

  • 开放定址法
    在遇到冲突时,按某一个长度,跳到下一个地址看是否有位置,如果有就把数据存在这个位置,没有的话就继续向下寻找。开放定址法的一般形式为: hi=(h(key)+di)%m i=1,2,…,k(k≤m-1)。其中:h(key)为哈希函数,di为增量序列,m为表长。
    【举例】已知一组关键字为(26,36,41,38,44,15,68,12,6),用除余法构造哈希函数,用开放定址法的线性探查再散列技术解决冲突,按照上述元素次序构造哈希表。
    若规定装填因子α=9/13,则m=13,哈希表为T[0…12]。
    在这里插入图片描述
    由m可知,p=13,则哈希函数为:h(key)=key%13,用开放定址法的线性探查再散列技术建立如下哈希表:
    在这里插入图片描述
    即遇见冲突时向下一位寻找是否有位置,直到找到位置为止,每向下寻找移动一次,比较次数就加一。最终得出下表:
    在这里插入图片描述
    等概率情况下,查找成功时的平均查找长度:
    在这里插入图片描述
  • 链地址法
    链地址法较为简单,用一道例题来解释:
    【举例】已知一组关键字为(26,36,41,38,44,15,68,12,6),用除余法构造哈希函数,用链地址法解决冲突,按照上述元素次序构造哈希表。
    在这里插入图片描述
    哈希函数:h(key)=key%13,等概率情况下,查找成功时的平均查找长度:在这里插入图片描述
    遇到冲突就多一条链而已,处理较为简单,查找也较快。

上面两种方法的ASL证明结果如下:
线性探测再散列:
在这里插入图片描述
链地址法:
在这里插入图片描述
可知时间只与装填因子有关,与n无关,所以要根据情况选择适当的装填因子来提高效率。

猜你喜欢

转载自blog.csdn.net/qq_41809589/article/details/86575724