散列表 (Hash table,也叫哈希表)
散列表是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
散列表是普通数组概念的推广,它支持insert,search,delete操作。在实践中,它的效率还是很高的,在一些合理的假设下,在散列表中查找一个元素的期望时间为O(1).
1直接寻址表
如下图,在关键字全域U,比较小时,直接寻址是一种简单而有效的技术。

其实操作类似于数组了,只不过索引是key(关键字)。这时的操作比较简单如下:

2散列表(哈希表)
直接寻址有个明显的问题,如果域U很大,在计算机内存有限的限制下,实现它就不实际了。因为K相对于U很小,分配给T的空间大部分都浪费了。
所以在哈希表中,我们加入 散列函数,就是把从实际关键字k,映射到散列表[0…M-1]的槽位上。这样空间开销就从|U|缩减到了M.
但是这样会带来问题,就是碰撞(collision),因为是多对少的映射,碰撞不可避免。

解决碰撞的方法之一是链接法(chaining):把散列到同一槽中的所有元素都放在一个链表中。如下图:

3散列表的性能分析
若给定一个能存放n个元素的,具有m个槽位的散列表T.若用链接法,最坏的情况效果会很差,所有元素都被映射到一个槽里面。所以我们要求映射函数h,要将所有的关键字均匀分布在m个槽位上。
假设,任何元素散列到m个槽中的每个槽是等可能性,且相互独立的。称这个假设为简单一致散列(simple uniform hashing).
在上面的假设下,且n=O(m).在散列表中所有操作的期望时间为O(1).
4散列函数的选择
好的散列函数应尽可能满足,简单一致散列的假设。
4.1除法散列法
通过取k除以m的余数,将关键字映射到m个槽中去,即
h(k)=k mod m
m不应该是是2的整数次幂。若m=2^p,则h(k)就是k的p个最低位数字,我们不清楚关键字的p最低位是否均匀,所以m应该尽量选择不太接近2的整数幂的质数。
4.2乘法散列法
用关键字k乘以常数A,并且抽出kA的小数部分,然后用m乘以这个值,再取底floor.即:
h(k)=floor( m( k*A mod 1) )
乘法散列,m没有太多限制,一般取2的整数次幂,A一般取,(sqrt(5)-1)/2.
4.3全域散列(universal hashing):
随机的选择散列函数,使之独立于要存储的关键字,这种方法称为全域散列。这样无论关键字怎么选,其平均性能都很好(思想类似于随机快速排序,为了避免最坏的情况,让最后一个数字与前面的随机交换)。
5开放寻址法(open addressing)
未完待续
散列表 (Hash table,也叫哈希表)的更多相关文章
- 散列表(has table、哈希表)
一. 散列表是什么 是包含映射关系的一种数据结构,可以提高查找效率. 二. 散列函数 1)必须是一致的.假设输入一个单词“banana”,映射的数字是1,那么以后每次输入banana都要映射到数字1, ...
- Java 集合 散列表hash table
Java 集合 散列表hash table @author ixenos 摘要:hash table用链表数组实现.解决散列表的冲突:开放地址法 和 链地址法(冲突链表方式) hash table 是 ...
- 散列表(Hash Table)
散列表(hash table): 也称为哈希表. 根据wikipedia的定义:是根据关键字(Key value)而直接访问在内存存储位置的数据结构.也就是说,它通过把键值通过一个函数的计算,映射到表 ...
- 散列表(Hash table)及其构造
散列表(Hash table) 散列表,是根据关键码值(Key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录 ...
- [转载] 散列表(Hash Table)从理论到实用(上)
转载自:白话算法(6) 散列表(Hash Table)从理论到实用(上) 处理实际问题的一般数学方法是,首先提炼出问题的本质元素,然后把它看作一个比现实无限宽广的可能性系统,这个系统中的实质关系可以通 ...
- [转载] 散列表(Hash Table)从理论到实用(中)
转载自:白话算法(6) 散列表(Hash Table)从理论到实用(中) 不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好 ...
- [转载] 散列表(Hash Table) 从理论到实用(下)
转载自: 白话算法(6) 散列表(Hash Table) 从理论到实用(下) [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还 ...
- 算法导论-散列表(Hash Table)-大量数据快速查找算法
目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内 ...
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- 建立简单的Hash table(哈希表)by C language
#define SIZE 1000 //定义Hash table的初始大小 struct HashArray { int key; int count; struct HashArray* next; ...
随机推荐
- 关于canvas中的jquery
关于h5,相比前端的同事们都很了解了吧!h5里面有个canvas,现在用的蛮火.但是canvas里面的代码确实是有点繁多,特别是要对于图形做什么操作的时候...我昨天无意间发现了一个canvas的插件 ...
- [译]深入理解JVM
深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...
- 增加p()函数,方便开发中对变量打印调试
在开发的过程中,我们经常要输出一下变量看看得到的结果是什么,我们就要根据变量的类型选择使用echo,print_r或者var_dump,brophp框架中的p()函数会自动根据变量类型选择用什么方法为 ...
- Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析
Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...
- Spark Streaming揭秘 Day19 架构设计和运行机制
Spark Streaming揭秘 Day19 架构设计和运行机制 今天主要讨论一些SparkStreaming设计的关键点,也算做个小结. DStream设计 首先我们可以进行一个简单的理解:DSt ...
- Android UI效果实现——滑动模糊渐变效果实现
前言: 大家应该都看到过iOS7解锁屏幕的滑动模糊渐变效果,好了,现在可以把手纸收起来了,今天黄老师就给大家讲一下如何在Android平台上 实现类似的滑动模糊渐变效果,其实方式远比你想像的简单. 目 ...
- Mysql数据库备份和还原常用的命令
Mysql数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,什么都无从做起,更谈不上什么备份还原,只有给系统这个命令,让它去执行,才能完成Mysql数据库备份和还原的操作,下 ...
- oracle 行转列 分析函数
oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...
- SVN备份教程(二)
上次的博文中SVN备份教程(一)我们简单介绍了一下SVN备份是如何操作的,今天我们接着将上次的问题进行优化. 1.问题回顾 在讲之前,我们先来将上次的问题重申一下.之前的SVN备份存在的问题很简单,每 ...
- 1199: [HNOI2005]汤姆的游戏 - BZOJ
Description 汤姆是个好动的孩子,今天他突然对圆规和直尺来了兴趣.于是他开始在一张很大很大的白纸上画很多很多的矩形和圆.画着画着,一不小心将他的爆米花弄撒了,于是白纸上就多了好多好多的爆米花 ...