散列表(Hash Table)
来源:互联网 发布:外貌协会的女生知乎 编辑:程序博客网 时间:2024/05/21 13:59
散列表也称作为哈希表,它是一个动态表,然而它支持字典的操作,因为它的存储一个值,需要相应的键。在查找一个值时,也需要一个键。最基本的操作就是:insert, search以及delete。散列表作为一个动态表,它的性能表现的异常好。甚至在合理的假设条件下,它的操作只需要
本章主要内容:
1. 直接地址法(Direct-address tables)
当我们的关键字全域
上图展示了,全域的大小就是表的大小,同时关键字只映射一个值。这个明显的一个缺点时,当我们的全域变得很大时,它就很会浪费空间。
2. 哈希函数(Hash function)
哈希函数的主要作用就是将我们的关键字映射成一个在哈希表中的位置。最基本的方法有除留余法,乘法散列,以及全域散列。在实际过程中我们用的更是复杂的哈希函数(如RS,JS),在这里我们只介绍全域散列。
全域散列
因为在实际当中,可能一个散列函数,会把许多关键子散列成同一个值,而实际当中最有效的方法就是,我们在一组不错的散列列函数,选择
3. 碰撞冲突
碰撞冲突,主要是因为我们在散列的时候可能散列到同一个值,这样就会形成冲突。在这里我们主要有种方法解决冲突。链接法,再哈希以及开放定址法。开放地址法还有线性探查,二次探查以及双重散列。
链接法
直接上图更容易清楚:
从途中我们可以看出,当我们有散列值冲突的时候,我们就需要用一个双向链表将冲突的具有相同的散列值得关键字链在一起。这样就能够很好的解决冲突。
我们来分析其一般的性能:假设表长为
个人觉得其有一个不好的点:就是对于频繁删除和添加的操作则,要不断频繁的创造节点和删除节点,可能会消耗大量的时间,不过它的实现过程十分简单而且解决冲突的效果也是十分不错。
再哈希
当我们关键字在
开放定址法(open addressing)
线性探测(linear probing)
假设表长为
给定一个关键字
二次探测(quadratic probing)
直接看散列函数:
和线性探测不同的时探测函数用的是二次函数。
双重散列(double hashing)
直接看散列函数:
3 种开放定址法对比
通过图我们可以很容易看出他们之间的区别
从上面我们可以看出,双重散列更接近均匀散列。线性探测,可能导致查找的平均时间变长,而二次探测为了能够充分利用散列表,则
均匀散列分析
定理3.1[1]
给定一个装载因子
定理3.2[2]
对于一个装载因子为
证明略,当
4. 源码
本人在clion IDE中实现的
5. 感谢
本文是基于《算法导论》写的,最主要的是有本人大量的心得体会,感谢《算法导论》的那些作者Thomas H.Cormen、Charles E.Leiserson等 人。如果有错误的请留言,不甚感激。谢谢。
6. 参考
[1]《算法导论》Thomas H.Cormen、Charles E.Leiserson等 第三版第11章 “散列表” p155
[2]《算法导论》Thomas H.Cormen、Charles E.Leiserson等 第三版第11章 “散列表” p155
[3]《算法导论》Thomas H.Cormen、Charles E.Leiserson等 第三版第11章 “散列表” p155
转载,请注明
- 散列表(Hash Table)
- 散列表 hash table
- 散列表 - Hash Table
- 散列表(Hash Table)
- 散列表(hash table)
- 散列表(Hash table)
- hash table——散列表
- Lisp语言:散列表(hash table)
- 散列表(Hash Table)全解析
- Lisp语言:散列表(hash table)
- 数据结构之---散列表(hash table)
- 算法导论---------------散列表(hash table)
- 哈希表(散列表 Hash Table)
- hash table 哈希表(散列表)
- (原创)散列表 hash table
- 算法导论之散列表(哈希表)详解(hash table)
- 数据结构—散列表(Hash table,也叫哈希表)
- 数据结构与算法____散列表(hash table)
- JAVA中创建对象的四种方式
- "Could not resolve placeholder"解决方案
- 腾讯EC .net API对接第三方系统
- 【Jenkins】——Jenkins+jmeter 定时测试
- 苹果-SSL 1637
- 散列表(Hash Table)
- 《剑指offer》之替换空格
- 开始PHP
- mybatis choose标签的使用
- 震惊!竟然可以这样使用自己的SDK开发Android
- hiho 1142 三分
- 成为设计师必看的40本书
- hdu 2570 迷障(贪心)
- ARM驱动开发之ioctl函数的使用