我是程序员;您好程先生;叫我序员就好了数据结构和算法分析程序员

数据结构(九)之哈希表理论

2018-03-28  本文已影响911人  coderwhy

如需转载, 请咨询作者, 并且注明出处.
有任何问题, 可以关注我的微博: coderwhy, 或者添加我的微信: 372623326

哈希表是一种非常重要的数据结构, 很多学习编程的人一直搞不懂哈希表到底是如何实现的.

在这一章节中, 我们就一点点来实现一个自己的哈希表. 通过实现来理解哈希表背后的原理和它的优势.

一. 认识哈希表

我们还像其他数据结构一样, 先来简单的认识一下哈希表.

哈希表介绍

体会哈希表

字母转数字

认识哈希化

二. 地址的冲突

尽管50000个单词, 我们使用了100000个位置来存储, 并且通过一种相对比较好的哈希函数来完成.

但是依然有可能会发生冲突, 比如melioration这个单词, 通过哈希函数得到它数组的下标值后, 发现那个位置上已经存在一个单词demystify, 因为它经过哈希化后和melioration得到的下标实现相同的.

这种情况我们成为冲突.

什么是冲突?

链地址法

开放地址法

线性探测
二次探测
再哈希法

三. 哈希化的效率

哈希表中执行插入和搜索操作可以达到O(1)的时间级,如果没有发生冲突,只需要使用一次哈希函数和数组的引用,就可以插入一个新数据项或找到一个已经存在的数据项。

如果发生冲突,存取时间就依赖后来的探测长度。一个单独的查找或插入时间与探测的长度成正比,这里还要加上哈希函数的常量时间。

平均探测长度以及平均存取时间,取决于填装因子,随着填装因子变大,探测长度也越来越长。

随着填装因子变大,效率下降的情况,在不同开放地址法方案中比链地址法更严重, 所以我们来对比一下他们的效率, 再决定我们选取的方案.

装填因子

开放地址法

线性探测
二次探测和再哈希

链地址法

效率的结论

上一篇 下一篇

猜你喜欢

热点阅读