目录

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. 图解算法学习笔记(六):广度优先搜索

    目录 1)图简介 2)图是什么 3)广度优先搜索 4)实现图 5)实现算法 6)小结 本章内容; 学习使用新的数据结构图来建立网络模型: 学习广度优先搜索: 学习有向图和无向图: 学习拓扑排序,这种排 ...

  2. 图解算法学习笔记(七):狄克斯特拉算法

    目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...

  3. 图解算法学习笔记(目录)

    今天遇到一本好书,如下,书很薄,不到200页,有将近400张图片,算法介绍的很有趣.这也是我读的第三本袁国忠先生翻译的书,向两位致敬. 目录大致如下; 第1章:二分查找和大O表示法: 第2章:数组和链 ...

  4. 图解算法学习笔记(四):快速排序

    目录 1) 示例1: 2)快速排序 3) 再谈大O表示法 4)小结 本章内容:学习分而治之,快速排序 1) 示例1: 假设你是农场主,有一小块土地,你要将这块地均匀分成方块,且分出的方块尽可能大.如何 ...

  5. 图解算法学习笔记(一): 算法简介

    本章内容: 编写第一种查找算法--二分查找. 学习如何谈论算法的运行时间--大O表示法. 1) 算法是一组完成任务的指令,任何代码片段都可视为算法. 2)二分查找:一种查找算法,其输入是一个有序的元素 ...

  6. 图解算法学习笔记(九):动态规划

    目录 (1)背包问题 (2)最长公共子串 (3)小结 本章内容: 学习动态规划,它将问题分成小问题,并先着手解决这些小问题. 学习如何设计问题的动态规划解决方案. (1)背包问题 我们再看第八章的背包 ...

  7. 图解算法学习笔记(八):贪婪算法

    目录 (1)背包问题 (2)集合覆盖问题 (3)NP完全问题 (4)小结 本章内容: 学习如何处理没有快速算法的问题(NP完全问题). 学习近似算法,使用它们找到NP问题的近似解. 学习贪婪策略. ( ...

  8. 图解算法学习笔记(二): 选择排序

    目录 1)数组和链表: 2)选择排序算法: 3)小结 本章内容: 两种基本数据结构:数组和链表: 选择排序算法: 1)数组和链表: 数组是连续的内存单元,链表可以不连续: 链表存储单元如图所示,每一个 ...

  9. 图解算法学习笔记(三):递归

    本章内容: 学习递归:如何将问题分解成基线条件和递归条件.     1) 每个递归函数都有两部分:基线条件(base case)和递归条件(recursive base).例如:打印3...2...1 ...

最新文章

  1. 测序数据质量统计软件fastqc,multiqc
  2. 使用C++与SFML编写一个简单的撞球游戏Part1——新建工程以及设置
  3. 透彻理解Socket网络编程
  4. bzoj1257 数学整理二分查询
  5. 垃圾回收 | Java垃圾回收,这杯咖啡,不仅好喝,而且实用!
  6. 电脑硬件知识学习_31岁,还在熬夜学习到2点的背后,是一个丈夫和父亲的责任与担当...
  7. android 4.0 蓝牙分析之二
  8. 54.购物流程(1)---simple product
  9. Druid.jar包
  10. 2022-2027年中国文化传媒行业市场调研及未来发展趋势预测报告
  11. JAVA12_12学习总结(JavaScript)
  12. java 基础 练习 幸运小游戏
  13. Windows系统提示应用程序无法正常启动(0xc0000142)解决方法
  14. 显示你个性的鼠标指针(转)
  15. pip安装pytorch出现报错MemoryError
  16. 微軟的後門:NTSD 無視任何安全軟件
  17. 线下+线上双管齐下,订单管理系统助力餐饮业提升销量
  18. 计算机数学课程标准,学习数学课程标准心得体会
  19. 置信度传播算法(Belief Propagation)
  20. PROTEL 99 常用库文件分立元件库和快捷键

热门文章

  1. HDU-6180 Schedule
  2. 奇迹世界服务器不响应,sun-奇迹世界 目前常见问题解决方法
  3. micropython oled中文_micropython中怎么将gb2312编码的字节流变成中文
  4. 手把手教你从0创建STM32串口空闲+DMA数据接收工程
  5. android 怎么自定义任务栈,Android中的Activity详解--启动模式与任务栈
  6. 三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算
  7. des 向量 java_在JAVA中使用DES算法
  8. bbb sd6 无e2 修改
  9. s3c2440的内存管理机制
  10. linux创建目录的语句,Linux的 文件 和 目录 管理(基本语句)