5散列表
1 散列函数
散列函数将输入映射到输出。
- 1.散列函数总是将同样的输入映射到相同的索引。同一个输入,其结果是一致的。如输入apple,每次都得到4。
- 2.散列函数将不通话的的输入映射到不同的索引。
- 3.散列函数直到数组有多大,只返回有效的索引。
散列表也被称为散列映射、映射、字典和关联数组。
2.应用案例
2.1 将散列表用于查找
创建电话簿
phone_book = {}
#或者phone_book = dict()
phone_book["马云"]=18888888888
phone_book["马化腾"]=16868686868
#获取马云的练习方式
print(phone_book["马云"])
散列表还适用于DNS解析
无论访问哪个网站,其网址都必须转换为IP地址。如
baidu.com -> 183.232.231.174
sina.com -> 36.156.86.241
163.com -> 111.3.84.41
2.2 防止重复
假如负责管理投票站。每人只能投一票。有人来投票,需要先查询他的姓名,并在投票名单中进行查找,确保未投过票。
如果使用简单查找,当列表非常长时,耗时将很久。
使用散列表,则非常快。
voted={}
def check_voter(name):
if voted.get(name):
print("已经投过票了")
else:
voted[name]=True
print("让他投")
check_voter("tom") #让他投
check_voter("mike") #让他投
check_voter("mike") #已经投过票了
2.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
2.4 小结
散列表适合用于:
- 模拟映射关系
- 防止重复
- 缓存/记住数据,以免服务器再通过处理来生成它们。
3.冲突
散列表长度一定比如key为a-z 26个字母,元素大于散列表的长度。a已经存了apple-1.49,如果再存储avocado-3.99,会因为给两个元素分配相同的位置的而冲突。为了避免冲突:如果两个key映射到同一位置,就在这个位置存储一个链表。
如果你的商品全是以a开头的,所有元素都存到一个链表中,散列表的速度会很慢。
经验:
- 散列函数很重要。散列函数要将key均匀的映射到散列表的不同位置。
- 如果散列表存储的链表很长,散列表的速度将急剧下降。如果使用的散列函数很好,链表就不会很长。
4. 性能
平均情况下,散列表执行各种操作的时间为常量时间(O(1))。
常量时间:不过散列表多大,所需的时间都相同。
散列表的性能:
操作 | 平均情况 | 最糟情况 |
查找 | O(1) | O(n) |
插入 | O(1) | O(n) |
删除 | O(1) | O(n) |
4.1 填装因子
填装因子=散列表包含的元素数/位置总数
如列表长度为5,里面有2个元素,其填装因子为0.4.
填装因子度量的是散列表中还有多少位置是空的。
填装因子大于1意味着商品数量超过了数组的位置数。一旦填装因子开始增大,你就需要在散列表中添加位置,这被称为调整长度。调整长度通常将数组增长一倍。
填装因子越低,发生冲突的可能性越小,散列表的性能越高。经验:一旦填装因子大于0.7,就调整散列表的长度。
4.2 良好的散列函数
良好的散列函数让数组中的值呈均匀分布,避免让值扎堆,导致大量的冲突。
5 小结
- 冲突很糟糕,良好的散列函数可以减少冲突
- 散列表的查找、插入和删除速度都非常快
- 散列表适合与模拟映射关系
- 一旦填装因子超过0.7,就该调整散列表的长度。
- 散列表可用于缓存数据
- 散列表非常适合用于方式重复
原文地址:https://www.cnblogs.com/csj2018/p/12088301.html
- 剑指OFFER之跳台阶(九度OJ1388)
- 剑指OFFER之二维数组中的查找(九度OJ1384)
- 剑指OFFER之用两个栈实现队列(九度OJ1512)
- 剑指OFFER之用两个栈实现队列(九度OJ1512)
- 简单的客户机服务器投射模拟
- 使用gcc编译gdb调试
- 剑指OFFER之第一个只出现一次的字符(九度OJ1283)
- c++中类长度解析
- 剑指OFFER之丑数(九度OJ1214)
- 剑指OFFER之把数组排成最小的数(九度OJ1504)
- 剑指OFFER之从1到n中出现1的次数(九度OJ1373)
- 剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)
- 剑指OFFER之最小的K个数(九度OJ1371)
- 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel 5.4前后台分离,通过不同的二级域名访问方法
- Yii框架数据库查询、增加、删除操作示例
- 在laravel5.2中实现点击用户头像更改头像的方法
- laravel 多图上传及图片的存储例子
- Laravel 添加多语言提示信息的方法
- Laravel框架表单验证操作实例分析
- Thinkphp5.0框架视图view的模板布局用法分析
- laravel5环境隐藏index.php后缀(apache)的方法
- php实现对文件压缩简单的方法
- laravel实现Auth认证,登录、注册后的页面回跳方法
- php 实现银联商务H5支付的示例代码
- Yii2.0框架behaviors方法使用实例分析
- laravel 去掉index.php伪静态的操作方法
- laravel 获取某个查询的查询SQL语句方法
- laravel dingo API返回自定义错误信息的实例