1.散列函数
- 条件:1)必须一致;2)不同输入应映射到不同的数字(索引),同样的输入映射到相同索引。
- 散列函数知道数组有多大,只返回有效索引
2.散列表
- 也称为散列映射、映射、字典和关联数组
- python中提供的散列表实现为字典。
- 散列表由键和值组成
book = dict()
#book = {} #python创建散列表的快捷方式
book["apple"] = 0.67
book["milk"] = 1.49
book["avocado"] = 1.49
print(book) #打印创建的散列表
print(book["avocado"]) #查询avocado对应的值
3.散列表的应用
- 应用包括查找(电话本、网站)、防止重复(投票)、缓存。
- 投票实例代码如下:
voted = {}
def check_voter(name):
if voted.get(name): #检查是否在散列表中(即是否投过票)
print("kick them out!")
else:
voted[name] = True
print("let them vote!")
if __name__ == '__main__':
check_voter("tom")
check_voter("mike")
check_voter("mike")
- 缓存的工作原理:网站将数据记住,不再重新计算 。缓存数据存储在散列表中。
- 缓存的优点:1)用户访问更快;2)服务器工作量少。
4.冲突
- 含义:给两个键分配的位置相同。
- 解决方法:如果两个键映射到了同一个位置,就在这个位置存储一个链表(不是最佳方法)。
- 避免冲突需要有较低的填装因子和良好的散列函数。
- 填装因子=散列表包含的元素数/位置总数。填装因子大于0.7,需调整散列表的长度。
- 良好的散列函数,如SHA函数。
5.性能
- 兼具数组和链表的优点
散列表(平均情况) | 散列表(最糟情况) | 数组 | 链表 | |
查找 | O(1) | O(n) | O(1) | O(n) |
插入 | O(1) | O(n) | O(n) | O(1) |
删除 | O(1) | O(n) | O(n) | O(1) |