图解算法学习笔记(五):散列表
目录
1)示例1:
2)散列函数
3)应用案例
4)冲突
5)性能
6)小结
本章内容:
学习散列表,最有用的数据结构之一。
学习散列表的内部机制:实现、冲突和散列函数。
1)示例1:
假设你在一家杂货店上班,有顾客来买东西时,你得在本子中查找价格。第一章介绍的简单查找,需要O(n)时间,如果你使用的是二分查找,时间为O(log n)。
二分查找的速度已经很快了,但作为收银员,在本子中查找价格是件很痛苦的事,即使本子的内容是有序的。在查找价格时,你都能感觉到顾客的怒气。但如果我们有一位雇员(Maggie),她能记住所有商品的价格,问她就能马上知道答案。这位雇员报出任何商品的价格的时间为O(1)。
2)散列函数
散列函数是这样的函数,无论你给它什么样的数据,它都还给你一个数字。
你可能认为散列函数输出的数字没什么规律,但其实散列函数必须满足一些要求。
- 它必须是一致的,输出与输入保持一致;
- 它应将不同的输入映射到不同的数字;
现在,我们可以打造我们的"Maggie"了。
首先创建一个空数组:
现在,我们将苹果的价格加入到数组中,输入为apple时,散列函数的输入为3,因此我们将苹果的价格存储到数组的索引3处。
不断地重复这个过程,最终整个数组将填满价格。
现在假设需要知道鳄梨(avocado)的价格,你无需在数组中查找,只需将avocado作为输入交给散列函数。,它会告诉你价格存储在索引4处。
散列函数之所以能准确地指出价格的存储位置,具体原因如下:
- 散列函数总是将同样的输入映射到相同的索引。
- 散列函数将不同的输入映射到不同的索引。
- 散列函数知道数组有多大,只返回有效的索引。
现在,我们可以结合散列函数和数组创建一个被称为散列表(hash table)的数据结构,在学习的复杂数据结构中,散列表可能是最有用的。Python提供的散列表实现为字典。
3)应用案例
散列表用途广泛,具体有:
- 手机里的电话簿,DNS解析;
- 防止重复;
- 将散列表用作缓存,缓存是一种常用的加速方式,所有的大型网站都使用缓存,缓存的数据存储在散列表中;
4)冲突
要明白散列表的性能,我们先搞清什么是冲突,现在我们有一个数组,它包含26个位置。
使用的散列函数非常简单,它按字母表顺序分配数组的位置。
现在,我们分别将苹果,香蕉、鳄梨的价格存储到散列表中,会出现下面这种情况:
这时出现了冲突(collision):给两个键分配的位置相同。
最简单的办法如下:如果两个键映射到同一个位置,就在这个位置存储一个链表。
通过上面的介绍,我们了解到散列函数很重要,理想的是散列函数将键均匀地映射到散列表的不同位置。
5)性能
散列表查找、插入、删除的运行时间如图所示:
在使用散列表是,避免最糟情况至关重要,为此,需要避免冲突,需要有:较低的填装因子,良好的散列函数。
填装因子度量的是散列表有多少位置是空的。一个经验是:一旦填装因子大于0.7,就调整散列表的长度。而什么是良好的散列函数,这不需要我们操心——天塌下来有高个子顶着。
6)小结
冲突很糟糕,你应使用可以最大限度减少冲突的散列函数。
散列表的查找、插入和删除速度都非常快。
散列表适合用于模拟映射关系。
一旦填装因子超过0.7,就该调整散列表的长度。
散列表可用于缓存数据(例如,在Web服务器上)。
散列表非常适合用于防止重复。
图解算法学习笔记(五):散列表相关推荐
- 图解算法学习笔记(六):广度优先搜索
目录 1)图简介 2)图是什么 3)广度优先搜索 4)实现图 5)实现算法 6)小结 本章内容; 学习使用新的数据结构图来建立网络模型: 学习广度优先搜索: 学习有向图和无向图: 学习拓扑排序,这种排 ...
- 图解算法学习笔记(七):狄克斯特拉算法
目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...
- 图解算法学习笔记(目录)
今天遇到一本好书,如下,书很薄,不到200页,有将近400张图片,算法介绍的很有趣.这也是我读的第三本袁国忠先生翻译的书,向两位致敬. 目录大致如下; 第1章:二分查找和大O表示法: 第2章:数组和链 ...
- 图解算法学习笔记(四):快速排序
目录 1) 示例1: 2)快速排序 3) 再谈大O表示法 4)小结 本章内容:学习分而治之,快速排序 1) 示例1: 假设你是农场主,有一小块土地,你要将这块地均匀分成方块,且分出的方块尽可能大.如何 ...
- 图解算法学习笔记(一): 算法简介
本章内容: 编写第一种查找算法--二分查找. 学习如何谈论算法的运行时间--大O表示法. 1) 算法是一组完成任务的指令,任何代码片段都可视为算法. 2)二分查找:一种查找算法,其输入是一个有序的元素 ...
- 图解算法学习笔记(九):动态规划
目录 (1)背包问题 (2)最长公共子串 (3)小结 本章内容: 学习动态规划,它将问题分成小问题,并先着手解决这些小问题. 学习如何设计问题的动态规划解决方案. (1)背包问题 我们再看第八章的背包 ...
- 图解算法学习笔记(八):贪婪算法
目录 (1)背包问题 (2)集合覆盖问题 (3)NP完全问题 (4)小结 本章内容: 学习如何处理没有快速算法的问题(NP完全问题). 学习近似算法,使用它们找到NP问题的近似解. 学习贪婪策略. ( ...
- 图解算法学习笔记(二): 选择排序
目录 1)数组和链表: 2)选择排序算法: 3)小结 本章内容: 两种基本数据结构:数组和链表: 选择排序算法: 1)数组和链表: 数组是连续的内存单元,链表可以不连续: 链表存储单元如图所示,每一个 ...
- 图解算法学习笔记(三):递归
本章内容: 学习递归:如何将问题分解成基线条件和递归条件. 1) 每个递归函数都有两部分:基线条件(base case)和递归条件(recursive base).例如:打印3...2...1 ...
最新文章
- 测序数据质量统计软件fastqc,multiqc
- 使用C++与SFML编写一个简单的撞球游戏Part1——新建工程以及设置
- 透彻理解Socket网络编程
- bzoj1257 数学整理二分查询
- 垃圾回收 | Java垃圾回收,这杯咖啡,不仅好喝,而且实用!
- 电脑硬件知识学习_31岁,还在熬夜学习到2点的背后,是一个丈夫和父亲的责任与担当...
- android 4.0 蓝牙分析之二
- 54.购物流程(1)---simple product
- Druid.jar包
- 2022-2027年中国文化传媒行业市场调研及未来发展趋势预测报告
- JAVA12_12学习总结(JavaScript)
- java 基础 练习 幸运小游戏
- Windows系统提示应用程序无法正常启动(0xc0000142)解决方法
- 显示你个性的鼠标指针(转)
- pip安装pytorch出现报错MemoryError
- 微軟的後門:NTSD 無視任何安全軟件
- 线下+线上双管齐下,订单管理系统助力餐饮业提升销量
- 计算机数学课程标准,学习数学课程标准心得体会
- 置信度传播算法(Belief Propagation)
- PROTEL 99 常用库文件分立元件库和快捷键
热门文章
- HDU-6180 Schedule
- 奇迹世界服务器不响应,sun-奇迹世界 目前常见问题解决方法
- micropython oled中文_micropython中怎么将gb2312编码的字节流变成中文
- 手把手教你从0创建STM32串口空闲+DMA数据接收工程
- android 怎么自定义任务栈,Android中的Activity详解--启动模式与任务栈
- 三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算
- des 向量 java_在JAVA中使用DES算法
- bbb sd6 无e2 修改
- s3c2440的内存管理机制
- linux创建目录的语句,Linux的 文件 和 目录 管理(基本语句)