文章目录
刷题的时候刷到了一个用到哈希表的题目~本人的刷题笔记分享在下面
LC141 环状链表 刷题笔记
----------------------------------------我是分割线--------------------------------------------
一、本章内容
- 学习最有用的基本数据结构之一——散列表。
散列表用途广泛 本章来介绍一下散列表常见的用途 - 学习散列表的内部机制:实现、冲突、散列函数
帮助我们来理解如何分析散列表的性能
二、引入
由例子引入散列表的概念~
假设 我在一家杂货店上班。
有顾客来买东西时,我需要在一个本子中查找价格,如果本子的内容不是按字母顺序排列的,我可能为查找苹果的价格而浏览每一行,这需要很长的时间!
这个查找方法就是简单查找——时间复杂度O(n)
还有一种查找方法 记录价格的本子是按照字母顺序排列的 查找苹果的价格可以使用二分法,根据字母的位置找到价格!
二分查找的时间复杂度为 O(logn)
(顺便说一句 简单查找效率真的很低!)
虽说二分查找时间复杂度已经很低了 但是你还是得“查找”不是?
我们如果有一个能记住所有商品的店员 那还查个啥 直接问它就完事了呗
再来对比一下
好那么问题来了 如何找到这样的店员呢
我们从数据结构的角度赖康康~
前面介绍了两种数据结构:数组&链表(还有一个不能用来查找的栈)
我们可以用数组来实现记录商品价格的本子
这种数组的每个元素包含两项内容:商品名和价格。
如果将数组按照商品名排序 就可以使用二分查找在其中查找商品价格辽。
然而!我们希望查找价格的时间为O(1) 这就要用到我们的散列函数了!
三、散列函数
1.啥是散列函数?
无论我们给散列函数什么数据,散列函数都会还给我们一个数字
专业术语表述:
散列函数将输入映射到数字
千万别认为散列函数输出的数字没什么规律!其实散列函数必须满足一些要求!
- 散列函数必须是一致的。
例如 我们输入apple时得到的是4
那么每次输入apple时得到的都必须为4 如果不是这样散列表将毫无用处
- 散列函数应该将不同的输入映射到不同的数字
不管输入啥都返回一个值的散列函数 不要也罢!
下面,我们利用散列函数来打造一个”输入商品名称就可以自动报价的”超级店员
2.打造知道所有商品[价格]的“超级店员”
【1】创建一个空数组
在这个数组中存储商品的价格。
【2】下面我们把苹果的价格加入这个数组中
apple作为输入交给散列函数
让散列函数输出一个值(3) 对应其存储在数组中的位置
【3】存储牛奶
输出为0 存储在索引0处
【4】以此类推 存储其他商品
数组中存满价格 每个存储价格对应的索引都可以指向商品!
这就是超级店员的秘诀!
【5】超级店员找价格的情景