《算法图解》笔记(4) 散列表
散列函数(hash table)
散列函数是这样的函数,即无论你给它什么数据,它都还你一个数字。散列函数“将输入映射到数字”。数组和链表都被直接映射到内存,但散列表更复杂,它使用散列函数来确定元素的存储位置。
Python提供的散列表实现为字典,你可使用函数 dict 来创建散列表。例如:book = dict()
还提供了一种创建散列表的快捷方式——使用一对大括号。例如:book = {}
散列表应用
1.查找
当你访问网站,其网址都必须转换为IP地址。这不是将网址映射到IP地址吗?这个过程被称为DNS解析(DNS resolution),散列表是提供这种功能的方式之一。
2.防止重复
使用散列表来检查是否重复,速度非常快。
检测是否投票示例代码:
voted = {} def check_voter(name): if voted.get(name): print('kick them out') else: #以 name 为名 存True 没存false voted[name] =True print('let them vote') check_voter('Tom') check_voter('mike') check_voter('mike')
3.将散列表用作缓存
缓存的工作原理:网站将数据记住,而不再重新计算。
冲突
冲突(collision):如果散列表给两个键分配的位置相同,就会产生冲突。处理冲突最简单的办法如下:如果两个键映射到了同一个位置,就在这个位置存储一个链表。
另外, 散列函数很重要,理想的情况是,散列函数将键均匀地映射到散列表的不同位置。填装因子:散列表所包含的元素数 / 位置总数。填装因子越低,发生冲突的可能性越小,
散列表的性能越高。一旦填装因子大于0.7,就调整散列表的长度。
总之要避免冲突,需要有:
- 较低的填装因子
- 良好的散列函数
小结
这里总结一下散列表:
- 你可以结合散列函数和数组来创建散列表。
- 冲突很糟糕,你应使用可以最大限度减少冲突的散列函数。
- 散列表的查找、插入和删除速度都非常快。
- 散列表适合用于模拟映射关系。
- 一旦填装因子超过0.7,就该调整散列表的长度。
- 散列表可用于缓存数据(例如,在Web服务器上)。
- 散列表非常适合用于防止重复。