散列表hash表学习笔记1

散列表或hash表或哈希表就是一个数组。
散列函数或hash函数或哈希函数就是计算数组(散列表)下标的方法,也是“键”的计算方法。
哈希算法就是哈希函数的实现。

hash值或哈希值或散列值是散列函数或hash函数或哈希函数计算出的值(下标),也是哈希表的下标,也是“键”。

哈希表里保存“键”对应的“值”,这构成了键值对。

装载因子:用来表示空位的情况,已填位数/散列表长度。

散列冲突:假设散列函数hash(key),key定义为键值,hash(key)为散列值,也即散列表的“键”(注意:非键值)。当key1≠key2,但hash(key1)==hash(key2)的现象称为散列冲突。什么意思呢?就是不同的输入,散列函数计算出来的散列值是相同的。也就是说计算出来的散列值相同,那么在把key2放到散列表时,key2和key1指向散列表的同一个位置,因为key1先放的,key2放时已经被key1霸占了,没有位置了。

散列表要求不存在散列冲突,但是世界上好像还没有不冲突的散列表。为啥?因为散列表是一块有限的内存空间,第一,总有满的时候,第二,位置总有被霸占的。第三,这就限制散列函数计算出来的散列值是在某个范围内的——而不是无限扩张的——这就导致散列冲突。

解决散列冲突的2种方法:开放寻址法和链表法。

1.开放寻址法
总体思路就是有冲突了,那就继续在散列表里找空闲的位置空间。
根据这种思想,实现有很多方法,其中3种方法:线性探测法、二次探测法和双重散列法。

(1)线性探测法
就是有冲突的时候,查找空闲位置的步长是1,比如hash(key)+0^1,
hash(key)+1^1,
hash(key)+2^1,…。

(2)二次探测法
二次探测法就是在线性探测法的基础上步长是平方。比如hash(key)+0^2,
hash(key)+1^2,
hash(key)+2^2,…。

(3)双重散列表法
多个hash函数,hash1,hash2,…。
hash1算出的有冲突就用hash2再算下,直到不冲突。

2.链表法
就是一个数组,每个元素上维护一组链表。
比如操作系统的优先级队管理方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值