首先,先说明一个问题,大部分人都会混淆的概念,那就是散列函数和散列表的概念。其实,散列函数和散列表是两种东西,我本人之前一直认为散列函数和散列表是一种东西,所以我想应该有很多人也这样认为,所以先来澄清这个概念。

散列函数

先来说散列函数,散列函数本质上,是个数学问题,散列函数有几个性质:
1.散列函数的输入域应该是无穷。
2.散列函数的输出域不是无穷,但是会分布到一个比较大的范围区间。
3.相同的输入,必定会映射到相同的输出。
4.既然输入域无穷大,输入域有限大小,那么,必然会发生碰撞,也就是,不同的输入经过散列函数计算后,算出相同的结果。
5.最重要的性质,如果输入数据量非常大,那么,输出结果在均匀分布在输出域上。
上面就是散列函数的5条性质。所以,只要满足上述5条性质的函数,都可以成为散列函数,因此,散列函数其实是个数学问题,实现散列函数的数学方式有很多。
总结一下,散列函数其实就是一个数学算法,把无穷的区间内的数据,经过散列函数计算后,均匀分到一个有限区间内。

散列表

说散列表之前,先说一条数学规律:有两个数据区间,S>M,如果一个数据集,在S上均匀分布,那么,将数据集中每个数据%M后,原数据集就会在M-1上均匀分布。
这也是散列表的原理。
虽然通常说散列函数的输出区间有限,但是往往也是非常大的区间。因为散列函数的性质决定了散列函数在其原始映射区间内均匀分布,那么,把原始数据先经过散列函数计算后,再对散列表的区间取余,就能将结果均匀分不到散列表的区间内了,这就是散列表。
总结一下,散列表只不过是经过散列函数计算后,将结果利用取余计算的性质,再均匀分布到一个更小的区间内,也就是散列表的区间,然后再处理一下散列碰撞的问题,一般是把重复的在后面加一个链表,不过,jvm中是把碰撞的结果放在一个红黑树中,如果散列表碰撞太多,效率太差,就需要扩容,这就是散列表。

备注

可以看出,散列函数是一个算法过程,而散列表是一个保存散列函数计算结果的数据结构。
下面介绍几个关于散列函数及散列表的经典问题。

1.给你一个散列函数,如何求出1000个散列函数?
其实不一定是1000,就是如何快速通过一个散列函数找到更多散列函数。可以将原始散列函数的映射区间,一分为二h1和h2,这两部分一定都是均匀分布的,然后h1+1h2,h1+2h2…h1+1000*h2. 就能实现,既然h1和h2均匀分布,那么他们经过线性计算后,仍然符合散列函数的性质。

2.给你一个超大的文件,100T,然后,文件中全都是一行行的字符串,现在请求出其中所有的重复的字符串?
数据量巨大,大数据的问题,一般都是用散列函数解决。这么大的数据,在一台电脑上处理,不太现实,因此,首先你需要问面试官,给你多少台分布式计算机?如果面试官给你1000台,那么,你下面的问题就是如何将这100T的数据,均匀分配给1000台分布式计算机上,然后让这1000 台计算机并发处理数据。而且,均匀分布到1000 台计算机上的数据,还要保证相同的数据肯定分配到相同的计算机上。怎么实现?很明显,均匀分布,相同数据映射到相同地方,散列函数的特征。因此,此题用散列函数分流,对每一行字符串计算散列值,然后取余1000,均匀映射到1000台上,并且相同数据一定映射到相同地址。后续,1000台服务器就可以并发执行了,效率提升1000倍。同时,每台计算机内部,其实还可以再利用多线程并发,这样原本的计算规模,就被分摊了。

深入理解散列函数和散列表相关推荐

  1. 如何实现搜索列表_图解:如何理解与实现散列表

    这是查找算法的第四篇文章 图解:如何理解与实现散列表 散列表的概念 散列表(Hash table),也叫做哈希表,是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值 ...

  2. 图解:如何理解与实现散列表

    这是查找算法的第四篇文章 图解:如何理解与实现散列表 散列表的概念 散列表(Hash table),也叫做哈希表,是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值 ...

  3. 散列:散列函数与散列表(hash table)

    1. 散列函数 如果输入的关键字是整数,则一般合理方法是直接返回对表大小取模(Key mod TableSize)的结果,除非 Key 碰巧具有一些不太理想的特质.如,表的大小为 10,而关键字都是 ...

  4. 列表根据下标取值_散列表(上):Word文档中的单词拼写检查功能是如何实现的?...

    Word这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在Word里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误".Word的这个单词拼写 ...

  5. 数据结构之散列表(七)

    前言 一.什么是散列表 散列表是如何组织数据的呢? 散列表的基本概念 二.Hash算法的设计 什么是Hash算法 Hash算法的应用场景 三.散列表冲突的解决 1. 开放寻址法 2. 链表法 3. 开 ...

  6. 数据结构与算法(七)—— 散列表结构及其实现和应用

    注:本篇内容参考了<Java常用算法手册>.<大话数据结构>和<算法导论(第三版)>三本书籍.并参考了百度百科. 本人水平有限,文中如有错误或其它不妥之处,欢迎大家 ...

  7. 散列表(上):Word 文档中单词拼写检查功能是如何实现的?

    本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 在平时我们使用Word的时候,输入一个错误的单词,它就会用标红的方式提示"拼写错误".Word的这个单词拼 ...

  8. 18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

    问题引入 在 Word 里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误",Word 文本编辑器的拼写检查功能是如何实现的呢?散列表(Hash Table) 散列表 散列 ...

  9. 图解算法学习笔记(五):散列表

    目录 1)示例1: 2)散列函数 3)应用案例 4)冲突 5)性能 6)小结 本章内容: 学习散列表,最有用的数据结构之一. 学习散列表的内部机制:实现.冲突和散列函数. 1)示例1: 假设你在一家杂 ...

最新文章

  1. vue2.0transition过渡的使用介绍
  2. MATLAB 画图时插入图例
  3. Java Pattern类的用法详解(正则表达式)
  4. addeventlistener事件第三个参数 passive_JS DOM 事件流、事件冒泡
  5. 下载kolla_Kolla部署实验手册
  6. [BZOJ1509][NOI2003]逃学的小孩
  7. java hashmap实例,关于java中的HashMap的实例操作
  8. 启动weblogic需要账号密码问题
  9. linux中如何运行html文件路径问题,Linux中如何查询运行文件的全路径的方法
  10. sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock
  11. python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...
  12. python定义输入变量_Python 2 声明变量 输入输出 练习
  13. Oracle 使用 PL/SQL Developer 生成 AWR 报告
  14. 台式计算机拆卸步骤,拆装台式电脑主机的方法图解步骤
  15. POI word 内容提取 Strict OOXML isn‘t currently supported, please see bug #57699
  16. pytorch 画loss曲线_Python练习绘制损失曲线,Pytorch,Loss
  17. [学习笔记]使用Vulcan L47网络测试仪仿真模拟TLSv1.2加密业务
  18. Android 工具类
  19. 基于微信小程序的校园信息共享平台 毕业设计-附源码211615
  20. 团购网站出路 艰难转型

热门文章

  1. 【讨论】怎么处理工作中的杂事?
  2. STM32之简易GUI(多级菜单进阶版)
  3. 什么是闭包?闭包的优缺点? 1
  4. CentOS7系统安装
  5. samba服务器搭建详细配置
  6. Framer for UX Design 用于UX设计的Framer Lynda课程中文字幕
  7. 网络安全 - 一名合格的Web安全工程师之成长路径
  8. SQL语法 自然连接 外连接 内连接
  9. C51——AUXR特殊功能寄存器时钟的电磁辐射
  10. linux下常用alias