问答丨如何理解哈希表的工作原理?
#我头新条闻#
哈希来自英文hash的翻译。其实恰如其分应该叫散列。散列的目的就是找到一个函数能够将一堆数字均匀分布在一维数组里。理想状态大家存储的位置是不同的,否则哈希函数比较糟糕。但是当两个数字经过一次哈希发现存在同一个数组里,还会二次哈希把他存在另外一个不同地方,这就是所谓双哈希。但是影响哈希存储的最关键因素是数组大小,当足够大大家发生碰撞机会比较少,这就是为什么内存数据库,key值达到内存70%就要扩容。刚才看到楼上说的太简单而且概念有些错误忍不住发表两句。我们很少会用到数组加链表方式,因为查询不稳定。基本通过空间换时间才能达到大o常数效率
#ICMLL实验室 #
科研工作者、科学达人
哈希表是根据关键值(key)来直接访问目标值(value)的一种数据结构。其特点就在于能够快捷的实现信息的查询和检索。
比如我们在手机中存放的通讯录就是用哈希表来实现的,即我们输入一个联系人的姓名,就能返回相应的电话号码。用哈希表实现的过程就是,将联系人姓名的字符通过一个哈希函数,映射成一个整数(哈希码),然后根据哈希码来索引出电话号码。比如哈希码为5,就表示是在存储位置为5,因此我们就能直接取出该位置的值,并返回结果。
那么实现哈希表的关键就在于哈希函数的构建,也就是如何建立一个合适的索引来满足如下条件:
1)同一个键每次输入到哈希函数中,其对应的哈希码也必须相同;
2)不同键对应的哈希码不能相同。
第一个条件意味着哈希函数必须是确定性的;第二个条件则要求不能出现哈希冲突。当两个或更多个键产生相同的哈希码时就会发生冲突(hash collisions)。
比如我们现在考虑建立一个简单的哈希表来查询年龄,{Jim:5, Davis:7, Taylor:12, Bob:3},如果我们选择哈希函数为输入键值的字符个数。那么在建立哈希表时,就讲Jim存放在位置3处,Jack存放在位置4处。而这样的话Jim和Bob的存储位置就会发生冲突,不符合哈希函数的要求。但是如果我们将哈希函数替换为首字母顺序存放,在这个数据中就没有哈希冲突了。
然而万一无法避免哈希冲突的话,我们可以用链接和线性探测的方法来避免哈希值发生碰撞。
链接就是将发生冲突的键值直接链接在链表的尾部;线性探测则是,如果在位置i处发生冲突,那么就检查i+1处是否为空,为空的话就将冲突键值放入其中,否则继续检查下一个。
#杨沐白 #
互联网算法工程师
谢邀。这个问题很有趣,哈希(Hashing)是一种用于从一组相似对象中唯一标识特定对象的技术。
一个简单的例子
我们生活中如何使用哈希的一些例子包括:
在大学中,每个学生都会被分配一个唯一的卷号,可用于检索有关它们的信息。
在图书馆中,每本书都被分配了一个唯一的编号,可用于确定有关图书的信息,例如图书馆中的确切位置或已发给图书的用户等。
在这两个例子中,学生和书籍都被分成了一个唯一的数字。
假设您有一个对象,并且您想为其分配一个键以便于搜索。 要存储键/值对,您可以使用一个简单的数组,如数据结构,其中键(整数)可以直接用作存储值的索引。 但是,如果密钥很大并且无法直接用作索引,则应使用哈希(Hashing)。
在哈希中,通过使用哈希函数将大键转换为小键。 然后将这些值存储在称为哈希表的数据结构中。 哈希的想法是在数组中统一分配条目(键/值对)。 为每个元素分配一个键(转换键)。 通过使用该键,您可以在O(1)时间内访问该元素。 使用密钥,算法会计算一个索引,该索引可以找到或插入条目的位置。
哈希一般分两步执行:
通过使用哈希函数将元素转换为整数。 此元素可用作存储原始元素的索引,该元素属于哈希表。
元素存储在哈希表中,可以使用哈希键快速检索它。
hash = hashfunc(key)
index = hash%array_size
在此方法中,哈希与数组大小无关,然后通过使用模运算符(%)将其缩减为索引(介于0和array_size - 1之间的数字)。
应用场景
关联数组:哈希表通常用于实现许多类型的内存表。 它们用于实现关联数组(索引是任意字符串或其他复杂对象的数组)。
数据库索引:哈希表也可以用作基于磁盘的数据结构和数据库索引(例如在dbm中)。
高速缓存:哈希表可用于实现高速缓存,即用于加速对数据的访问的辅助数据表,其主要存储在较慢的介质中。
对象表示:一些动态语言(如Perl,Python,JavaScript和Ruby)使用哈希表来实现对象。
提升速度:哈希函数用于各种算法,以使其计算更快。
∑编辑 | Gemini
来源| 今日头条
更多精彩:
☞ 哈尔莫斯:怎样做数学研究
☞ 扎克伯格2017年哈佛大学毕业演讲
☞ 线性代数在组合数学中的应用
☞ 你见过真的菲利普曲线吗?
☞ 支持向量机(SVM)的故事是这样子的
☞ 深度神经网络中的数学,对你来说会不会太难?
☞ 编程需要知道多少数学知识?
☞ 陈省身——什么是几何学
☞ 模式识别研究的回顾与展望
☞ 曲面论
☞ 自然底数e的意义是什么?
☞ 如何向5岁小孩解释什么是支持向量机(SVM)?
☞ 华裔天才数学家陶哲轩自述
☞ 代数,分析,几何与拓扑,现代数学的三大方法论
算法数学之美微信公众号欢迎赐稿
稿件涉及数学、物理、算法、计算机、编程等相关领域,经采用我们将奉上稿酬。
投稿邮箱:math_alg@163.com
问答丨如何理解哈希表的工作原理?相关推荐
- 散列表(哈希表)工作原理 (转)
1. 引言 哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用. 哈希表最大的优点,就是把数据的存储和查找消耗的时间大 ...
- 飞鸽传书谈哈希表之数学原理
这里的文章是飞鸽传书谈哈希表之数学原理转载的,作者:niniwzw 15:08 2010-5-6 .NET程序员,大多数时候是不需要数学的.因为,有了.NET, 数据结构和算法的重要性被弱化了,操作系 ...
- 深入浅出地理解STM32中的定时器工作原理
深入浅出地理解STM32中的定时器工作原理 一.如何实现延时 1 纯硬件电路 2 纯软件编程 3 可编程定时/计数器 二.可编程定时/计数器有哪些功能? 三.STM32F103 的定时器有哪些 1 基 ...
- 智能电表专用服务器,详细分解4种远程智能电表抄表系统工作原理
现在的智能电表可以远程抄表已经没有什么稀奇的,对于从事这个行业的人对于它的工作原理再也熟悉不过了,但是对于大部分的电工还是有些不明白的.所以今天小编就来给大家详细的介绍远程智能电表抄表系统工作原理,希 ...
- 理解 JSON 的数据储存工作原理及对象和文本间的转换方法
目标: 理解 JSON 的数据储存工作原理及对象和文本间的转换方法. 什么是 JSON? JSON 是一种按照JavaScript对象语法的数据格式.虽然它是基于 JavaScript 语法,但它独立 ...
- 【电气专业知识问答】问:高压断路器失灵保护的工作原理是什么?
[电气专业知识问答] 问:高压断路器失灵保护的工作原理是什么? 答:断路器失灵保护是指,当电力系统发生故障时,故障元件的保护正确动作发出断路器跳闸脉冲后,断路器拒绝动作时,能以较短的时限跳开同一母线上 ...
- 单相费控电能表的工作原理
电能表作为电能计量的工具,在能源管理中发挥着重要作用.随着技术的发展,单相费控电能表逐渐成为电能表的主流.本文将介绍单相费控电能表的工作原理,包括其测量电能和计量电能的方法,常见问题以及应用场景. 一 ...
- 开局一张图帮你充分理解哈希表(散列表)
目录 1哈希表的概念: 1.1哈希表的插入图示: 1.2哈希表的查询图示: 2.哈希冲突 2.1哈希冲突的概念: 2.2避免冲突 2.2.1哈希函数设计 2.2.2负载因子的调节 3.解决冲突 3.1 ...
- 理解哈希表1(转贴)
很好的一篇文章,转来转去,也懒得去找出处了,作者邮箱 iliuchong@sohu.com [摘要] 哈希表是一种高效的数据结构.本文分五个部分:首先提出了哈希表的优点,其次介绍了它的基础操作,接着从 ...
最新文章
- 谷歌、DeepMind强强联手再发布Dreamer:性能远超“前辈”PlaNet
- Asp.Net中跳转页面有那几种方法
- c语言 feof_C语言 实现简单功能的12306火车售票系统【附源码】
- git fetch和git pull的区别_Git实战(实验楼)学习笔记 实验2 基本用法(下)
- h5上传图片_怎么搭建自己的H5响应式网站
- 前端学习(3131):react-hello-react之总结ref
- Python机器学习:多项式回归与模型泛化010L1L2和弹性网络
- java8 stream 多个_java8 stream两个集体交集、差集、并集操作
- L3-001. 凑零钱-PAT团体程序设计天梯赛GPLT(01背包,动态规划)
- 判断app访问还是web访问网站
- python机器学习乳腺癌细胞模型
- WindowsXP相关设置对应的注册表位置
- 0.96寸OLED12864显示屏设计方案(原理图+PCB+BOM表+程序)
- 海湾gst5000协议号_海湾GST5000主机基本操作
- inferred type_您最终可以使用var在Java中声明Inferred Type局部变量-这就是为什么它很棒...
- 腾讯云学生服务器(官网校园计划)
- keil编译代码Program Size详解
- CSS深度学习 - 文本方向 direction 和 dir
- java awt 玫瑰图形
- mysql的mvcc 和next-lock
热门文章
- 哈希值+非对称加密+网络+数字签名,你真的知道怎么给游戏充钱吗
- 布尔类型(boolean/Boolean)自动生成的get方法需要注意的小细节
- 现代软件工程 - 期末评比及作业要求
- BUAA - Team Review Score
- oracle层级关系按列存储_几张图看懂列式存储
- python的内置函数string_Python错误:内置函数或方法对象没有属性“StringIO”
- Java中的变量、数据类型和运算符
- Java虚拟机JVM的内部体系结构
- java 根据圆心计算圆弧上点的经纬度_【控制测量学】-高斯投影正算公式以及java代码
- linux脚本写的计算器,一步步打造自己的linux命令行计算器