《算法图解》第五章散列函数和散列表
1.散列表能够快速地查找到要的数据,且不重复。
1.1散列函数
无论给散列函数什么,他都返回一个数字---将输入映射到数字
a.必须是一致的,比如输入“apple”,输出“1”,就不会输出其他的了
b.它将不同的输入映射到不同的数字,这是最好的情况
c.散列函数知道数组有多大,只返回有效的索引,如果数组只包含5个数字,不可能返回无效索引100
2.散列表--包含额外逻辑的数据结构
使用数组和散列函数构成的
数组和列表都被直接映射到内存,但散列表更复杂,它利用散列函数来确定元素的存储位置
python里可以直接用{}来表示散列表 等价与dict()
3.如果发生冲突的话,即同一个位置放了好几个数据,那就用链表来表示这些数据
4.解决冲突的方法
4.1减少填装因子?---衡量性能
散列表内的数据个数/总的数组长度度量有多少位置是空的
当填装因子增大的时候,要改变散列表的长度,这个操作称为“调整长度”,通过函数hash来进行调整,但是调整散列表的时间很长,开销很大,尽量避免
一般这个因子大于0.7,就要修改散列表的长度
4.2良好的散列函数
良好的散列函数能够让数值均分分布
5.运行时间/性能
散列函数 平均情况是O(1),最差情况是O(n)
可以看出散列表在平均情况下性能是多么的优越了
6.应用
6.1投票防止重复
voted={}
def voted(name):
if voted.get(name):
print('kick them out!')
else:
vote[name]=True 对已经投标的人进行标记
print('let name vote')
6.2用作缓存
网页将数据记住,不再重新记住
浏览器就是这样操作的,将url映射到页面数据
cache={}
def get_page(url):
if cache.get(url):
return cache[url]
else:
data=get_from_server[url]
cache[url]=data
return data
散列表适合用于:
模拟映射关系;
防止重复;
缓存/记住数据,以免服务器再通过处理来生成它们。
7.小结
你可以结合散列函数和数组来创建散列表。
冲突很糟糕,你应使用可以最大限度减少冲突的散列函数。
散列表的查找、插入和删除速度都非常快。
散列表适合用于模拟映射关系。
一旦填装因子超过0.7,就该调整散列表的长度。
散列表可用于缓存数据(例如,在Web服务器上)。
散列表非常适合用于防止重复。