《算法图解》读书笔记 第五章 散列表 学习这个用途广泛且超级有用的基本数据结构!

本文是《算法图解》第五章读书笔记,深入探讨了散列表这一重要数据结构。通过实例介绍了散列函数、冲突解决、性能分析,揭示了散列表在查找、防止重复和缓存中的应用。同时强调了良好散列函数和低填装因子对性能的重要性。
摘要由CSDN通过智能技术生成

刷题的时候刷到了一个用到哈希表的题目~本人的刷题笔记分享在下面
LC141 环状链表 刷题笔记

----------------------------------------我是分割线--------------------------------------------

一、本章内容

  • 学习最有用的基本数据结构之一——散列表。
    散列表用途广泛 本章来介绍一下散列表常见的用途
  • 学习散列表的内部机制:实现、冲突、散列函数
    帮助我们来理解如何分析散列表的性能

二、引入

由例子引入散列表的概念~
假设 我在一家杂货店上班。
在这里插入图片描述

有顾客来买东西时,我需要在一个本子中查找价格,如果本子的内容不是按字母顺序排列的,我可能为查找苹果的价格而浏览每一行,这需要很长的时间!

这个查找方法就是简单查找——时间复杂度O(n)

还有一种查找方法 记录价格的本子是按照字母顺序排列的 查找苹果的价格可以使用二分法,根据字母的位置找到价格!

二分查找的时间复杂度为 O(logn)

在这里插入图片描述

(顺便说一句 简单查找效率真的很低!)
在这里插入图片描述

虽说二分查找时间复杂度已经很低了 但是你还是得“查找”不是?
我们如果有一个能记住所有商品的店员 那还查个啥 直接问它就完事了呗
在这里插入图片描述
再来对比一下
在这里插入图片描述

好那么问题来了 如何找到这样的店员呢

我们从数据结构的角度赖康康~
前面介绍了两种数据结构:数组&链表(还有一个不能用来查找的
我们可以用数组来实现记录商品价格的本子
在这里插入图片描述
这种数组的每个元素包含两项内容:商品名价格

如果将数组按照商品名排序 就可以使用二分查找在其中查找商品价格辽。

然而!我们希望查找价格的时间为O(1) 这就要用到我们的散列函数了!

三、散列函数

1.啥是散列函数?

无论我们给散列函数什么数据,散列函数都会还给我们一个数字
在这里插入图片描述

专业术语表述:
散列函数将输入映射到数字

千万别认为散列函数输出的数字没什么规律!其实散列函数必须满足一些要求!

  • 散列函数必须是一致的。

例如 我们输入apple时得到的是4
那么每次输入apple时得到的都必须为4 如果不是这样散列表将毫无用处

  • 散列函数应该将不同的输入映射到不同的数字

不管输入啥都返回一个值的散列函数 不要也罢!

下面,我们利用散列函数来打造一个”输入商品名称就可以自动报价的”超级店员

2.打造知道所有商品[价格]的“超级店员”

【1】创建一个空数组
在这里插入图片描述
在这个数组中存储商品的价格。
【2】下面我们把苹果的价格加入这个数组中

apple作为输入交给散列函数
在这里插入图片描述

让散列函数输出一个值(3) 对应其存储在数组中的位置
在这里插入图片描述
【3】存储牛奶
在这里插入图片描述
输出为0 存储在索引0处
在这里插入图片描述
【4】以此类推 存储其他商品
在这里插入图片描述
数组中存满价格 每个存储价格对应的索引都可以指向商品!
这就是超级店员的秘诀!
【5】超级店员找价格的情景

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值