《算法图解》第五章散列函数和散列表

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服务器上)。
散列表非常适合用于防止重复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值