哈希表
来源:互联网 发布:物流网络存在的问题 编辑:程序博客网 时间:2024/06/05 15:00
在线性表、树等结构中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。
哈希表是一种以键-值(key-idx_value)存储数据的结构,只要输入待查找的值的key,通过哈希函数H,即可找到值对应的索引idx_value = H(key),也称哈希地址。
思路:
如果所有的键key都是整数,则可以使用一个简单的无序数组来实现:将键作为索引,值为其对应的值,这样就能快速访问任意键的值。(更加复杂类型的键可基于此来扩展)
查找步骤:
1使用哈希函数将被查找的键转换为数组的索引。理想情况下,不同的键会被转换为不同的索引值,但有些情况下需要处理多个键被哈希到同一个索引的情况。这个时候就产生了冲突。
2处理哈希碰撞冲突。
1构造哈希函数
哈希查找第一步就是使用哈希函数将键映射成索引。这种映射函数就是哈希函数。哈希函数需要易于计算并且能够均匀分布所有键。
常用的构造哈希函数的方法有:
1.1直接定址法
取关键字或关键字的某个线性函数值为哈希地址。即:
H(key)=key或H(key)=a*key+b
1.2数字分析法
假设关键字是以r为基数的数(如,以10为基数的十进制数),并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。
例如,长度为64位的整型变量addr,可取其前32位作为关键字的哈希地址。
1.3平方取中法
取关键字平方后的中间几位作为哈希地址。
1.4折叠法
将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。
1.5除留余数法
取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址,即:
H(key) = key % p, 其中p<=m
2处理冲突
1线性探测法(转载)
线性探测法是开放寻址法解决哈希冲突的一种方法,基本原理为,使用大小为M的数组来保存N个键值对,其中M>N,我们需要使用数组中的空位解决碰撞冲突。
在该图中,”Ted Baker” 是有唯一的哈希值153的,但是由于153被”SandraDee”占用了。而原先”Snadra Dee”和”JohnSmith”的哈希值都是152的,但是在对”SandraDee”进行哈希的时候发现152已经被占用了,所以往下找发现153没有被占用,所以存放在153上,然后”Ted Baker”哈希到153上,发现已经被占用了,所以往下找,发现154没有被占用,所以值存到了154上。
开放寻址法中最简单的是线性探测法:当碰撞发生时即一个键的散列值被另外一个键占用时,直接检查散列表中的下一个位置即将索引值加1,这样的线性探测会出现三种结果:
1)命中,该位置的键和被查找的键相同
2)未命中,键为空
3)继续查找,该位置和键被查找的键不同。
2再哈希法
3拉链法(转载)
将大小为M 的数组的每一个元素指向一个条链表,链表中的每一个节点都存储散列值为该索引的键值对,这就是拉链法。
图中,”JohnSmith”和”Sandra Dee”通过哈希函数都指向了152这个索引,该索引又指向了一个链表, 在链表中依次存储了这两个字符串。
该方法的基本思想就是选择足够大的M,使得所有的链表都尽可能的短小,以保证查找的效率。对采用拉链法的哈希实现的查找分为两步,首先是根据散列值找到等一应的链表,然后沿着链表顺序找到相应的键。
4建立一个公共溢出区
假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,每个分量存放一个记录。另设立向量OverTable[0..v]为溢出表。所有关键字和基本表中关键字冲突时,不管它们由哈希函数得到的哈希地址是什么,都填入溢出表。
参考:浅谈算法和数据结构 十一:哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- .哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- MVC3系列~Html.BeginForm与Ajax.BeginForm
- shell基础
- 【正整数模板运算(C++手写BigInteger类和java.math.BigInteger以及java.math.BigDecimal)】
- File类
- HDU 2962 Trucking(Dijkstra+二分)
- 哈希表
- Code Generate of Power Designer
- 排序算法
- 查找算法
- Eclipse中10个最有用的快捷键组合
- CSS3 @font-face详细用法local
- C++线程 -- boost::barrier解决多线程分工问题
- POJ 3276 Face The Right Way 开关问题
- css 控制文字位置