《算法图解》笔记(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服务器上)。
  • 散列表非常适合用于防止重复
posted @ 2019-03-11 19:34  WMXNLFD  阅读(248)  评论(0编辑  收藏  举报