博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《算法图解》第五章笔记与课后练习_散列函数与散列表
阅读量:5017 次
发布时间:2019-06-12

本文共 1296 字,大约阅读时间需要 4 分钟。

软件环境:Python 3.7.0b4

一、散列函数

无论你给它什么数据,它都还你一个数字。它必须满足一些要求:

  • 它必须是一致的。例如,假设你输入apple时得到的是4,那么每次输入apple时,得到的都必须为4。
  • 它应将不同的输入映射到不同的数字。例如,如果一个散列函数不管输入是什么都返回1,那它就不是好的散列函数。最理想的情况是 将不同的输入映射到不同的数字。

使用函数dict来创建散列表

>>> book = dict()>>> book["apple"] = 0.67  # 一个苹果的价格是67美分>>> book["milk"] = 1.49>>> book["avocado"] = 1.60>>> print(book){
'apple': 0.67, 'milk': 1.49, 'avocado': 1.6}>>> print(book["milk"])1.49 # 牛奶的价格

 

散列表由键和值组成。在前面的散列表book中,键为商品名,值为商品价格。散列表将键映射到值。

 

 

二、应用案例

1,将散列表用于查找

假设你要创建一个电话簿,将姓名映射到电话号码。该电话簿需要提供如下功能:

  • 添加联系人及其电话号码。
  • 通过输入联系人来获悉其电话号码。

下面我们来使用散列表进行对电话簿的创建映射和查找。

 

2,防止重复

假如你负责管理一个投票站,每个人只能投一票,如何避免重复投票呢?

voted = {} # 创建一个散列表def check_voter(name):  if voted.get(name): # 检查他是否在散列表中    print("kick them out!")  else:    voted[name] = True    print("let them vote!")

 

3,将散列表用作缓存

缓存是一种常用的加速方式,所有大型网站都使用缓存,而缓存的数据则存储在散列表中。

缓存的优点:

  • 用户能够更快地看到网页。
  • 服务器需要做的工作很少。
cache = {}def get_page(url):    if cache.get(url):        return cache[url] # 返回缓存的数据    else:        data = get_data_from_server(url)        cache[url] = data # 先将数据保存到缓存中        return data

 

说明:仅当URL不在缓存中时,让服务器做这些处理,并将处理生成的数据存储到缓存中,再返回它。这样,当下次有人请求该URL时,你就可以直接发送缓存中的数据,而不用再让服务器进行处理,耗费资源。

 

三、小结

  • 可以结合散列函数和数组来创建散列表。
  • 散列表的查找、插入和删除的操作速度都非常快。
  • 散列表适合用于模拟映射的关系。
  • 散列表可用于缓存数据(例如在Web服务器上)。
  • 散列表非常适合用于防止重复。

 

转载于:https://www.cnblogs.com/OctoptusLian/p/9032593.html

你可能感兴趣的文章
架构漫谈读后感
查看>>
Codeforces 689A Mike and Cellphone
查看>>
Python入门之Python Colorama模块
查看>>
HDU 3853-loop(概率dp入门)
查看>>
spring mvc 引入log4日记记录maven工程 slf4j和log4j输出到控制台配合使用log4j不输出到文件...
查看>>
单片机按键长短按得识别原理
查看>>
Bootstrap按钮组学习
查看>>
ArcGIS AddIN开发之 设置当前工具为Edit Tool
查看>>
Luogu-P1020(导弹拦截)(DP,LIS ,二分优化)
查看>>
抽象类与接口
查看>>
SQL Server中默认数据库和默认表的作用
查看>>
Java生鲜电商平台-支付模块的设计与架构
查看>>
VC++6.0,VB6.0,VFP6.0下载
查看>>
将数据导出成excel表
查看>>
Codeforces 628F Bear and Fair Set
查看>>
webpack4.0 实战记录
查看>>
移动端适配
查看>>
网络对抗技术_作业一_201521430001
查看>>
MJRefresh第三方库浅析
查看>>
ThreadPoolExecutor源码解析
查看>>