【算法入门】散列表

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)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值