数据结构(二)Hash表

一、哈希表
散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构。哈希表就是基于字典实现的
通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。记录的存储位置=f(key)。这里的对应关系 f 称为散列函数,又称为哈希 (hash)函数,而散列表就是把Key通过哈希函数转换成一个整型数字(内存地址),然后就将该数字对数组长度进行取余(除留余数法或其他方法),其结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以查找的速度很快。
哈希表和一般的字典相似,都使用过键值对存储的数据结构。不同的是:
-字典的 key 是无序的,并且是自定义的
-哈希表的 key 是线性的,并且是通过 哈希函数生成的
 
*例:要存储 [5,4,7,6] 的四个元素
1.先确定哈希函数,h(k) = k mod 4
2.h(5) = 1,所以Hash[1] = 5;h(4) = 0,所以Hash[0] = 4;h(7) = 3,所以Hash[3] = 7;h(6) = 2,所以Hash[2] = 6
3.如果我们想查找hash表中有没有 7 这个元素:首先计算出 h(7) = 3;然后判断 Hash[3] 是否等于 7 。如果等于说明hsah表中有 7
 
-用hash表只做一次判断就能验证出,元素 7 是否存在(字典的查找速度要更快)
-用for循环判断,需要3次判断次可以找到 7
 
 
二、哈希冲突
由于哈希表的大小是有限的,而要存储的值的总数量是无限的,因此对于任何哈希函数,都会出现两个不同的元素映射到同一个位置上的情况,这种情况叫做哈希冲突。
比如:h(k) = k mod 7, h(0) = h(7) = h(14) = ...
 
1.解决哈希冲突--开放寻址法
开放寻址法:如果哈希函数返回的位置已经有值,则可以向后探查新的位置来存储这个值
    ①线性探查:如果位置i被占用,则探查i+1, i+2,...
    ②二次探查:如果位置i被占用,则探查i+12, i-12, i+22, i-22,...
    ③二度哈希:有n个哈希函数,当使用第一个哈希函数h1发生冲突时,则尝试使用h2, h3,...
 
2.解决哈希冲突--拉链法
拉链法:哈希表每一个位置都连接一个链表,当冲突发生时,冲突的元素将被加到该位置链表的最后。
 
 
三、哈希实现
# hash表构造的基本过程
h = lambda x: x % 6
hashtable = {}
lis = [1,6,3,9]
for i in lis:
    hashtable[h(i)] = i
print(hashtable)
 

猜你喜欢

转载自www.cnblogs.com/xiaoqichaoren/p/12951653.html