[stackoverflow]哈希表是如何工作的?

原地址:http://stackoverflow.com/questions/730620/how-does-a-hash-table-work

Lane

正文:

这是一个对于外行的解释.

让我们假设你不仅想要用书填满图书馆,还想当你需要就很容易的找到他们.

所以,你觉得如果一个人想要读一本书,需要知道这书的确切书名去寻找,应该可以找到书.一个人有书名+图书管理员的帮助,应该很快很容易的找到书.

所以,你要如何做呢?哦,显然你可以持有一些列表来存你把书放哪了,但是这时就有个问题,你要想在图书馆里找书,就得查列表.假定,这列表又简单又好查,但是你并不想查一本书就把整个列表从头到尾按顺序查一遍.

你想要一个这样的东西,只要给个书名,就回复一个正确的地点,然后你漫步到书架旁拿书即可.

但怎么才能达到这样的效果?当你填书到图书馆时得做点预处理工作.

不能像刚刚那样从头到尾填书,你得设计一个巧妙的办法,你拿出书的书名,通过一个小程序跑出书架号和位置号,来存该书.

这个神奇的程序的用处,就是过会再有人来读这本书,你就通过这个程序和书名,得到书架名和位置名,这两就是你最早放书的地方.

这个程序呢,就被叫做哈希算法或者哈希计算,是种带参数的算法,跑出一组数.

简单说呢,就是把字母、符号什么的换成数字,然后算个结果.实际情况,比这个复杂些,不过也就是这个意思.

这个程序的重点呢,就是你每次输入同样的书名或者什么东西,每次输出的结果都是一个结果,无论你输了多少次,过了多久.

好了,这就是哈希表工作的基础流程.

对于内行而言,

首先,存在一个数的尺寸.通常哈希算法的结果是在一些大数的范围里,一定要远远大于你在表中存的个数.举个例子,我们要存100万的书,那么输出结果可以是0到一个比100万大的多的数即可.

我们做什么呢?用计算模型,我们找的数比范围的最大值大,就再一次从0开始找.

就是算法的范围是0-20,存的数就7个,我们找17,我们得一轮找7个,再来一轮,再找0,1,2,3,最后是3.

当然,计算模型不都是这样,需要更多的设计和考虑.17除7余3.

你就知道书在位置3了.

这就导致了新的问题, 冲突.书填满了图书馆.算出的书会算出以前就使用过的,你想放书的时候,发现这个书架和位置都已经放书了.

存在非常多的解决冲突的办法,换个算法,或者找附近的,找将来要放的地方.不过靠谱的办法还是在一开始就设计更好的方法避免冲突.

最后,其实很多时候,你都可能想要放更多的书在图书馆的承受范围之外.你需要建个更大的图书馆.你可能还能用原来的书架和位置,也可能得重新来一遍,来存新的改变的书架和位置.

时间: 2024-08-29 12:11:44

[stackoverflow]哈希表是如何工作的?的相关文章

哈希表(转)

JAVA哈希表 哈希表是一种重要的存储方式,也是一种常见的检索方法.其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元.检索时采用检索关键码的方法.现在哈希表有一套完整的算法来进行插入.删除和解决冲突.在Java中哈希表用于存储对象,实现快速检索. Java.util.Hashtable提供了种方法让用户使用哈希表,而不需要考虑其哈希表真正如何工作. 哈希表类中提供了三种构造方法,分别是: publ

memcached源码分析-----哈希表基本操作以及扩容过程

        转载请注明出处:http://blog.csdn.net/luotuo44/article/details/42773231 温馨提示:本文用到了一些可以在启动memcached设置的全局变量.关于这些全局变量的含义可以参考<memcached启动参数详解>.对于这些全局变量,处理方式就像<如何阅读memcached源代码>所说的那样直接取其默认值. assoc.c文件里面的代码是构造一个哈希表.memcached快的一个原因是使用了哈希表.现在就来看一下memca

哈希表类Hashtable

哈希表是一种重要的存储方式,也是一种常见的检索方法.其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元.检索时采用检索关键码的方法.现在哈希表有一套完整的算法来进行插入.删除和解决冲突.在Java中哈希表用于存储对象,实现快速检索. Java.util.Hashtable提供了种方法让用户使用哈希表,而不需要考虑其哈希表真正如何工作. 哈希表类中提供了三种构造方法,分别是: public Hasht

哈希表工作原理 (并不特指Java中的HashTable)

1. 引言         哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用.  哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间:而代价仅仅是消耗比较多的内存.然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的.另外,编码比较容易也是它的特点之一.         哈希表又叫做散列表,分为“开散列” 和“闭散列”.考虑到竞赛时多数人通常避免使用动态存储结构,本文中的“哈希表”仅

哈希表工作原理

1. 引言        哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用. 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间:而代价仅仅是消耗比较多的内存.然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的.另外,编码比较容易也是它的特点之一.        哈希表又叫做散列表,分为“开散列” 和“闭散列”.考虑到竞赛时多数人通常避免使用动态存储结构,本文中的“哈希表”仅指“闭

【搜索引擎(二)】索引、倒排索引、哈希表、跳表

索引 其实在计算机中我们早已接触过跟索引有关的东西,比如数据库里的索引(index),还有硬盘文件系统中其实也有类似的东西,简而言之,索引是一种为了方便找到自己需要的东西而设计出来的条目,你可以通过找索引找到自己想要内容的位置.索引过程是: 关键字->索引->文档.在图书馆内的书分门别类,就是一种按类别来分的索引.当然索引还有很多其他的实现. 仅仅有索引的概念是不够的.虽然分门别类是一种方法,但是我们在拥有一堆文档的时候必须要有从文档到索引的规范过程,并且索引的结构要满足能够让人(或者计算机)

上古时代 Objective-C 中哈希表的实现

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性能分析 NXHashTable 的作用 NXHashTable 的实现有着将近 30 年的历史,不过仍然作为重要的底层数据结构存储整个应用中的类. 文中

普通集合和泛型集合的区别,哈希表和字典表的区别,队列和堆栈的区别以及堆和栈的区别。

普通集合和泛型集合的区别: 泛型集合与传统集合相比 类型更安全. 泛型集合无需装箱拆箱操作. 泛型的重要性. 泛型是未来五年的主流技术 ... 通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员.此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱. 下面的泛型类型对应于现有的集合类型: List 是对应于 ArrayList 的泛型类. Di

从头到尾彻底解析哈希表算法

说明:本文分为三部分内容,第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法. 第一部分:Top K 算法详解 问题描述 百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个.一个查询串的重复度越高,说明查询它的用户越多,也就是越热门.),请你统计最热门的10个查