哈希表

来源:互联网 发布:物流网络存在的问题 编辑:程序博客网 时间:2024/06/05 15:00

    在线性表、树等结构中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。

    哈希表是一种以-值(key-idx_value)存储数据的结构,只要输入待查找的值的key,通过哈希函数H,即可找到值对应的索引idx_value = H(key),也称哈希地址

思路

如果所有的键key都是整数,则可以使用一个简单的无序数组来实现:将键作为索引,值为其对应的值,这样就能快速访问任意键的值。(更加复杂类型的键可基于此来扩展)

查找步骤

1使用哈希函数将被查找的键转换为数组的索引。理想情况下,不同的键会被转换为不同的索引值,但有些情况下需要处理多个键被哈希到同一个索引的情况。这个时候就产生了冲突。

2处理哈希碰撞冲突。

1构造哈希函数

哈希查找第一步就是使用哈希函数将键映射成索引。这种映射函数就是哈希函数。哈希函数需要易于计算并且能够均匀分布所有键。

常用的构造哈希函数的方法有:

1.1直接定址法

    取关键字或关键字的某个线性函数值为哈希地址。即:

H(key)=keyH(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]为溢出表。所有关键字和基本表中关键字冲突时,不管它们由哈希函数得到的哈希地址是什么,都填入溢出表。


参考:浅谈算法和数据结构 十一:哈希表



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上古卷轴5任务失败怎么办 上古卷轴5爆显存怎么办 老滚5卡住了怎么办 上古卷轴5被木河镇人追杀怎么办 关门的时候有响怎么办 家里门关门太响怎么办 网上赌搏输了2万怎么办 梦见不顺心的事怎么办 振动声桥洗澡时怎么办 同校生2高潮了怎么办 经期血发黑量少怎么办 电脑键盘右边数字键不能用怎么办 御宅伴侣特别卡怎么办 电脑网络出现三角叹号怎么办 同校生2卡顿怎么办 电脑卡了没反应怎么办 促排卵泡多要怎么办 把朋友搞摔倒意外死亡怎么办 猫见到狗受惊了怎么办 头被桌子撞肿了怎么办 鱼缸里的鱼缺氧怎么办 上火眼皮打拉下来怎么办 小孩头敲了个包怎么办 四个月不吃奶怎么办啊 4个月宝宝不吃奶粉怎么办 3个月婴儿不喝奶怎么办 地图舌加裂纹舌怎么办 3个月宝宝厌食怎么办 宝宝不吃奶吃手怎么办 三个月的宝宝光吃手不吃奶怎么办 九个月宝宝积热怎么办 前门牙露神经了怎么办 7岁宝宝吐舌头怎么办 连续液精几个月了怎么办 接吻时对方伸舌头我要怎么办 亲嘴不想让对方伸舌头怎么办 喝醉酒想吐吐不出来怎么办 凉了胃怎么办喝什么药 生宝宝后屁股扁了怎么办 屁股又宽又扁怎么办 烫伤一年多色差没有恢复怎么办