05-散列表

数据结构和算法
基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏

第5章 散列表

假设你在一家杂货店上班。有顾客来买东西时,你得到一个本子中查找价格。如果本子的内容不是按字母顺序来排序的,你可能为查找苹果价格而浏览每一页,这显然需要很长的时间。此时使用简单查找,需要浏览每一行,这需要的时间为O(n)。
但如果以为名叫Maggie的店员能记住全部商品的价格,那就不需要查找,马上就能知道答案。报出商品价格的时间为O(1),这速度比二分查找都快。
在这里插入图片描述
在这里插入图片描述

5.1 散列表
散列表是这样的函数,即无论你给它什么数据,它都能还给你一个数字。
在这里插入图片描述

专业术语的表达是:散列函数“将输入映射到数字”。
满足以下要求:

  • 必须一致。例如,输入Apple时得到4,那么每次输入Apple时,得到的都必须是4。
  • 应将不同的输入映射到不同的数字。

散列函数具体原理:

  • 散列函数总是将同样的输入映射到相同的索引(其实不一定,见5.3冲突)。
  • 散列函数将不同的输入映射到不同的索引。
  • 散列函数知道数组有多大,值返回有效的索引。如果数组包含5个元素,散列函数就不会返回无效索引100。

使用散列函数和数组创建了一个被称为散列表(hash table)的数据结构。
数组和链表都被直接映射到内存,但散列表更复杂,它使用散列函数来确定元素的存储位置。
散列表使用数组来存储数据,因此其获得元素的速度与数组一样快。
任一优秀的语言都提供了散列表的实现。Python提供的散列表实现为字典,由键和值组成,使用函数dict来创建散列表。
在这里插入图片描述

5.2 应用案例
在这里插入图片描述
在这里插入图片描述

5.2.2 防止重复
使用散列表来检查列表内元素是否重复,速度非常快。
在这里插入图片描述

voted = {}
def check_voter(name):if voted.get(name):print("kick them out!")else:voted[name] = Trueprint("let them vote!")

5.2.3 将散列表用作缓存
以网站工作为例,缓存是一种常用的加速方式,所有大型网站都使用缓存,而缓存的数据则存储在散列表中,当打开网页时,网站将数据记住,而不再从新计算(缓存/记住数据,以免服务器再通过处理来生成它们)。
网站使用缓存,用户能够更快看到页面,并减少网站的工作量。

比如当你访问facebook页面时,它首先检查散列表中是否存储了该网页。
在这里插入图片描述

cache = {}
def get_page(url):if cache.get(url):return cache[url]else:data = get_data_from_server(url)cache[url] = datareturn data

5.3 冲突
假设我们要将apple的价格存储到散列表中,分配第一个位置。
在这里插入图片描述

将banana的价格存储到散列表中,分配第二个位置。
在这里插入图片描述

但现在要将avocado的价格存储到散列表中,分配的也是第一个位置。但这个位置已经存储了价格,这种情况被称为冲突(cllision)。

处理冲突的方法有很多,最简单的是:如果两个键映射到了同一个位置,就在这个位置存储一个链表。
在这里插入图片描述
在这里插入图片描述

如果散列表中存在很多很长的链表,那么散列表的速度会变慢。所以散列函数很重要。好的散列函数会将键均匀地映射到散列表的不同位置。好的散列函数很少导致冲突。
减少位置的浪费。
在这里插入图片描述

5.4 性能-如何选择好的散列函数
为避免冲突,需要:

  • 较低的填装因子。
  • 良好的散列函数。

5.4.1 填装因子
填装因子=散列表包含的元素个数 / 散列表位置总数
在这里插入图片描述

填装因子度量的是散列表中有多少位置是空的。
理想情况是刚好装满,也就是填装因子为1(实际不太可能实现)。

填装因子大于1意味着商品数量超过了数组的位置数。一旦装填因子开始增大,就需要在散列表中添加位置,这被称为调整长度(resizing):通常创建一个更长的数组(原来的两倍);再使用函数hash将所有的元素都插入都这个新的散列表中。

填装因子越低,发生冲突的可能性越小,散列表的性能越高。(一般填装因子大于0.7,就调整散列表长度。)

5.4.2 良好的散列函数
良好的散列函数让散列表呈数组,值均匀分布。
在这里插入图片描述

糟糕的散列函数让值扎堆,导致大量的冲突,出现大量的链表。
在这里插入图片描述

5.5 小结

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

——持续修改完善中…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

疯狂ios讲义疯狂连载之实现游戏逻辑(2)

13.6.5 定义获取通道的工具方法这里所谓的通道指的是一个方块上、下、左、右4个方向上的空白方块图13.10显示了一个方块四周的通道。图13.10 方块四周的通道下面是获取某个坐标点四周通道的4个方法。程序清单codes/13/Link/Link/sources/board/FKGameService.m13.6.6 没有转折点…

linux之进程间通信--使用信号

一、什么是信号用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号…

解决Maven工程中报 Missing artifact jdk.tools:jdk.tools

2019独角兽企业重金招聘Python工程师标准>>> 解决方法&#xff1a; 在pom.xml中添加如下依赖&#xff1a; <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>…

回到地球之后,这个男人创建了Ubuntu

文 | 大东出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;2002 年&#xff0c;莫斯科当地时间 4 月 25 日 9 时 26 分&#xff0c;满载着补给和 3 名宇航员的“联盟-TM 号”航天飞船在“联盟 U”火箭的推进下飞往国际空间站。同行的三人中&#xff0c;年…

Hadoop完全分子式环境搭建—问题及解决办法

Hadoop完全分布式环境搭建 ps:本人是按照尚硅谷的教程搭建的&#xff0c;版本hadoop2.7&#xff0c;centos版本6&#xff0c;一台主机&#xff0c;两台从机。 一&#xff0e;版本问题 1.尽量使用hadoop版本2&#xff0c;尽量不要使用最新版本3。因为会出现无法解决的问题&…

POJ 2135 最小费用最大流

思路&#xff1a; 源->1连费用0 流量2 其它的边 费用w 流量1 n->汇 费用0 流量2 最小费用流 搞定~ //By SiriusRen #include <queue> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 2010 #def…

06-广度优先搜索:图、队列

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第6章广度优先搜索 6.1 简介 广度优先搜索—breadth-first search&#xff0c;BFS. 主要内容图和队列。 广度优先搜索能让你能够找出两样东西之间的最短距离&#xff0c;比如&#xff1a;编写国际跳…

虎年云原生落地技术趋势

今天是立春&#xff0c;虎年第一天。去年我写过一篇 牛年 dotnet云原生技术趋势[1]&#xff0c;今天再来写一篇虎年云原生落地技术趋势&#xff0c;去年局限在.NET 平台上的云原生落地&#xff0c;我今年在去年探索云原生落地的基础上从多语言云原生技术落地的趋势来谈谈。在 2…

WdatePicker 设置日期第一个比第二个的日期小

WdatePicker 设置日期第一个比第二个的日期小 可以设置&#xff0c;日期只显示某一天的&#xff0c;比如只显示周一&#xff0c;和周日 <input id"Text1" class"Wdate" onFocus"WdatePicker({disabledDays:[0,2,3,4,5,6],maxDate:#F{$dp.$D(\Text2…

07-狄克斯特拉算法

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第7章 狄克斯特拉算法 上一章的广度优先搜索&#xff0c;找出的是段数最少的路径&#xff1b; 本章狄克斯特拉算法&#xff0c;找出的是最快的路径。 7.1 使用狄克斯特拉算法 步骤&#xff1a; 第…

聊聊mysql执行过程

在项目开发当中 &#xff0c;很多时候&#xff0c;我们的数据库应用优化都是从表层到里层的一个过程。比如一个查询写下来 &#xff0c;我们的优化方向大多时候都是先看方法执行的时间长短&#xff0c;然后再决定是否去优化它&#xff0c;下意识的第一步操作都是看是否命中索引…

01. Node js Hello world

2019独角兽企业重金招聘Python工程师标准>>> 01. Node js Hello world 环境安装 官网http://nodejs.org/ Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, no…

异常检测之浅谈入侵检测

打开微信扫一扫&#xff0c;关注微信公众号【数据与算法联盟】 转载请注明出处&#xff1a;http://blog.csdn.net/gamer_gyt 博主微博&#xff1a;http://weibo.com/234654758 Github&#xff1a;https://github.com/thinkgamer前言 由于业务关系&#xff0c;最近一段时间一直在…

企业知识库在跨地域团队协作中的价值

随着全球化进程的不断加速&#xff0c;越来越多的企业开始面临跨地域协作的挑战。在这种背景下&#xff0c;企业知识库作为一种重要的知识管理工具&#xff0c;对于提高团队协作效率、促进知识共享与创新具有不可替代的价值。接下来就说一下知识库在跨地域团队协作中的重要性及…

Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题

前言看了下推送记录&#xff0c;一个月前&#xff0c;OK&#xff0c;我又变成月更了o(╯□╰)o&#xff0c;这绝对不行&#xff01;[○&#xff65;&#xff40;Д&#xff65; ○]所以今天来更新了其实不是我懒得更新或者是太忙&#xff0c;其实是最近在写一篇很长的博客&…

spring之二——使用maven创建一个java project

2019独角兽企业重金招聘Python工程师标准>>> maven的安装及Eclipse maven插件安装这里不再说了&#xff0c;安装可以看这篇博客&#xff1a; http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 需要注意的是&#xff0c;maven在w…

自从装了windows神器,再也不用羡慕mac了

1. 命令行神器 1.1 GOW Gow&#xff08;Gnu On Windows&#xff09;是Cygwin的轻量级替代品。 它使用一个方便的NSIS安装程序&#xff0c;安装超过100个非常有用的开源UNIX应用程序&#xff0c;编译为本机win32二进制文件。 它被设计为尽可能小&#xff0c;大约18 MB&#xff…

第1章 绪论

《数据结构》学习笔记 第1章 绪论 1.1 数据结构的研究内容 计算机计算数值时&#xff0c;一般经过一下步骤&#xff1a; 1.从具体问题抽象出数学模型&#xff08;实质是分析问题&#xff09;。 2.设计一个解次数学模型的算法。 3.编写程序&#xff0c;进行测试、调试&#xf…

C#中泛型约束的具体用法

前言上一篇博文简单介绍了泛型的约束&#xff0c;说是通过where<>来实现具体委托占位符的约束。那么约束又有什么类型和次序呢。这篇文章咱们一起看看。目前共5种类型的约束。类名&#xff1a;只有这个类型的类或从它继承的类才能用作类型实参class&#xff1a;任何引用类…

系统架构:Web应用架构的新趋势 前后端分离的想法

最近研究servlet&#xff0c;看书时候书里讲到了c/s架构到b/s架构的演变&#xff0c;讲servlet的书都很老了&#xff0c;现在的b/s架构已经不是几年前的b/s架构&#xff0c;其实b/s架构就是web应用开发&#xff0c;对于这样的架构我们现在应该考虑的是前端和后端的分离&#xf…