图解算法 第五章 散列表

本章学习

  • 散列表是最有用的基础数据结构,Python中叫字典dict()
  • 散列表的内部机制:实现、冲突、散列函数

情景导入(数组的索引时间为O(1))

你现在是一个杂货店老板的孩子,暑假你帮忙打理小店。第一件事就是记下每件商品的价格。你可以聪明的按照类别来分:水果、香烟、零食、饮料。但是因为你是个新手,你也可能没有分类的记下了每个商品的价格,例如:红富士苹果:3.9 元/斤,利群香烟:20元/包等等。这个时候来了一个顾客,他要买卫龙辣条,然后你就认真的翻阅每一条信息,直到找到对应的价格。最糟糕的情况是卫龙辣条可能在最后一列。这个时候你所花的时间就是O(n)。如果你是按照类别分类的你只需要花O(logn)。这样你的速度已经很快了,不过如果你店里面的产品非常多,仍然需要顾客等很久。有什么办法是我输入商品,就能立马得到商品价格【时间为O(1)】

散列函数

散列函数:将输入映射到数字,将输入映射到索引,这样就可以实现O(1)提取

散列函数需要满足的条件

  •  它必须一致,以小卖部为例,第一次输入:红富士苹果显示3.9。第二次再输入,它还应该是3.9.不管多少次,他都应该是3.9
  •  它应该把不同的输入映射到不同数字,例如一个散列不管输入什么都是返回1,就不是个好的散列函数

散列表hash table:包含额外逻辑的数据结构。

数组和链表是被直接映射到内存,散列函数是确定元素的存储位置(链表的位置如何返回)

散列表(hash table)的应用案例

一:查找

手机内置的电话簿:名字对应电话号码,Python中快速建表:phone_book = { }

  • Q:使用数组如何创建电话薄?

散列表用于大海捞针的查找:网址和IP地址访问映射

二:防止重复

列入:举行一次选举,每人一票,之前投票的人就不能再投票了。

三:将散列表用作缓存

缓存工作原理:他储存再散列表中,以Facebook为例

  1. 向FB服务器发出请求
  2. 服务器生成一个网页发给你
  3. 你获得一个网页

缓存的优点:更快看到网页/FB需要做的更少

冲突collision(实际上是很难将不同的键映射到不同位置的)

例子:有一个数组,有26个位置用于存储。当你输入apple,banana是按照顺序a,b排序的。但是当你再输入ab产品的时候就有问题了,他和apple共享位置。

解决的方法也简单粗暴:这个位置键入一个链表(相当于数组中键入链表,散列表只是映射关系)

好的散列表:较低填装因子/良好的散列函数

填装因子:散列表包含元素/位置总数,例如:占用2个位置,总共有5个位置。那就是2/5.一般大于0.7就毕竟偏高了。

良好的散列函数:呈均匀分布

猜你喜欢

转载自blog.csdn.net/weixin_42199275/article/details/81092904