今天聊聊「哈希表」,「哈希表」主要作用在于高效查找。

  在编程实现中,常常面临着两个问题:存储和查找,存储和查找的效率往往决定了整个程序的效率。

  脑补下,你在家里忘记了指甲刀放在哪里,通常要在你家所有抽屉中顺序寻找,直到找到,最差情况下,有N个抽屉,你就要打开N个抽屉。这种存储方式叫数组,查找方法称为「遍历」。

  脑补下,你是一个整理控,所有物品必须分门别类放入整理箱,再将整理箱编号,比如1号放入针线,2号放入证件,3号放入细软。这种存储和查找方式称为「哈希」,如果这个时候要查找护照,你不许要再翻所有抽屉,直接可在2号整理箱中获取,通常只用一次查找即可,如何编号整理箱,称为哈希算法。

  同样是查找,差距怎么那么大涅~,假设我们有100亿条数据记录,那差距就变得明显,遍历需要查找最多100亿次,最少1次,哈希只需1次。

  让我们正式介绍哈希和哈希算法,哈希也称散列,哈希表是一种与数组、链表等不同的数据结构,与他们需要不断的遍历比较来查找的办法,哈希表设计了一个映射关系f(key)= address,根据key来计算存储地址address,这样可以1次查找,f既是存储数据过程中用来指引数据存储到什么位置的函数,也是将来查找这个位置的算法,叫做哈希算法。

  让我们举个例子,比如下面这几个人物,按数组存储:

  这样我要找到大胸姐的电话号码,需要顺序查找对比整个数组,第一个余罪,不是,第二个不是,第三个不是,直到第四个找到大胸姐。

  如果以hash存储呢?首先让我们来看看如何设计哈希算法,哈希算法可以随意设计,教科书上一般会说以下几种方法:直接定址发,平方取中法,除数取余法,哈希算法的本质上是计算一个数字,如果用这几种方法讲解会稍显晦涩,我们假设我们的哈希算法是取姓名的首字母。所以f(余罪) = y, f(傅老大) = f,f(沈嘉文) = s,f(大胸姐) = d。

  构建的hash表如下:

  我们看到他们分别以姓名首字母的位置插入到这一张表格中,这样我们构建了这样一个Key-Value表格,此表就是哈希表,也称为Hash Table。未来,当我们要查找余罪的时候,通过计算,余罪在y位置,可以通过1次查找,找到这条记录,也即手机号。

  这个时候有客官问了,那以首字母为哈希函数的话,应该有很多比如以y的姓名啊,这个时候就不是一次查找了吧,其实有很多条记录都映射到一个位置上,称为哈希冲突。

  哈希冲突是跟哈希函数的设计正相关的,你的随机性越大,那么产生哈希冲突的可能性越小,在小概率下,如果还有冲突怎么办,这个时候要做些有损的设计,比如如果有两个首字母为y的姓名,那么可以接到余罪的后面,当查找的时候,需要先查找到y,然后再顺序查找,如图所示:

  还有一些解决哈希冲突的办法叫「哈希再哈希」,也就是针对第一次哈希的结果再进行一次hash来减小冲突的概率。

  这就是Hash表,首先Ta是一种数据结构,是一种效率极高的查找方式,哈希表的核心在于哈希函数的设计,哈希冲突了不要紧,我们要增加随机性以及对冲突进行适当的有损化的处理。

程序员常说的「哈希表」是个什么鬼?相关推荐

  1. html如何看数据是不是写死的,程序员常讲的「写死」是什么意思?

    我们在开发软件的过程中对于一些固定不变的参数都会写死,这个时候很多人也许不明白程序员嘴里说的「写死」是什么意思?可以不写死吗?不写死就会增加难度吗?这里吾爱编程为大家介绍一下关于程序员常讲的写死是什么 ...

  2. 程序员面试中常见的哈希表,到底是什么?

    作者 | 倪升武 责编 | 胡巍巍 我所写的这些数据结构,都是比较经典的,也是面试中经常会出现的,这篇文章我就不闲扯了,全是干货,如果你能读完,希望对你有所帮助~ 哈希表也称为散列表,是根据关键字值( ...

  3. j - 数据结构实验:哈希表_一看就懂的数据结构基础「哈希表」

    哈希表 哈希表(Hash table),是存储键值(Key Value)对数据的一种数据结构. 例如,我们可以将人的名字作为键,性别作为值来存储.通过把键映射到表中的一个位置来访问数据,以提高查找速度 ...

  4. 优秀的程序员都在关注「沉默王三」公众号

    话不多说,拿起手机,打开微信,扫描下方的二维码,关注[沉默王三]公众号,就对了. 接下来,吹些牛逼. 二哥(三哥他哥)我在 CSDN 上算是名气够大了吧,想必你也是亲眼目睹啊.首页推荐,专栏推荐,蒋涛 ...

  5. 第九十二期:多少程序员注意到了「中台」的背面?

    中台这个词,最近两年特别火,它的爆发源于2015年张勇在阿里发出的内部信中提到的"大中台,小前台"战略.随后吸引了很多人开始"追逐"它.也有很多人开始借着这概念 ...

  6. java中级程序员面试题_中级Java程序员常见面试题汇总

    下面是一些中级Java程序员常见面试题汇总,你可以用它来好好准备面试. 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器 ...

  7. 程序员常说的API是什么意思?API类型有什么呢?

    程序员常说的API是什么意思?API类型有什么呢? API是什么意思呢?在定义上,API(Application Programming Interface),中文翻译是应用程序编程接口,是一些预先定 ...

  8. 计算机软件水平考试程序员之程序设计知识点汇总,软考程序员常考知识点汇总.docx...

    软考程序员常考知识点汇总软考程序员常考知识点汇总 2015年软考程序员考试知识点FoxPro程序设计 1.命令文件的建立.修改和运行 (1)命令文件的建立与修改MODIFYCOMMAND[/?][IN ...

  9. 程序员常去的100个网站

    程序员常去的100个网站! 1 J2me开发网 http://www.j2medev.com/bbs/index.asp 2 J2me社区 http://www.j2meforums.com/foru ...

最新文章

  1. Matlab中解决出现的错误使用 svmtrain (line 234) Y must be a vector or a character array.问题
  2. linux下maxwell安装教程,完美起航-Maxwell采集binlog系列(二)-Linux系统安装MySQL
  3. 石子合并(动态规划DP)
  4. 启动tomcat和java步骤
  5. Windows C盘格式化或者同平台迁移oracle数据库
  6. 洛谷1123 取数游戏
  7. mysql游标使用 loop_mysql 游标 loop while 的使用
  8. CCNA自学教材推荐(转)
  9. SAP 各模块常用T-Code
  10. GPS从入门到放弃(十六)--- 卫星时钟误差和卫星星历误差
  11. 图灵社区python kindle_推送mobi至Kindle流程说明(简要操作)
  12. WIN10系统的ghost备份还原的详细步骤
  13. openslide read region 出现黑块 解决办法
  14. 域名网址被微信屏蔽的解决方案微信域名网址被屏蔽了红了如何继续使用
  15. WEB前端期末大作业——关于酒店主题网站设计——高级酒店公寓网页(4页)
  16. 优秀的JavaScript模块是怎样炼成的
  17. Github上开源项目readme里好看的高大上的有趣的徽章从何而来
  18. parseInt() 函数的奇怪行为
  19. 【DEVOPS】基于禅道 - 重构研发协作流程
  20. js简单实现拦截访问指定网址

热门文章

  1. Ubuntu14.04下Endpoint5.1的安装及使用方法
  2. 【OpenCV】 车辆识别 运动目标检测
  3. java上传视频到七牛云_使用SpringMVC上传视频到七牛云上
  4. 七牛云图片在iOS和微信里面不显示问题处理
  5. QT APP实战-图片播放器
  6. Android四大组件之广播接收器BroadcastReceiver
  7. 【Python】如何将写好的Python代码打包成exe文件?
  8. Qt中使用OpenGL渲染视频
  9. 浏览器的同源策略及跨域解决方案
  10. Playbook的用法