首页 > 其他分享 >哈希表

哈希表

时间:2024-02-16 10:33:19浏览次数:23  
标签:Hash 哈希 索引 查找 内存 key

哈希表是什么?

  • 哈希表是一种数据结构
  • 哈希表表示了关键码值和记录的映射关系
  • 哈希表可以加快查找速度
  • 任意哈希表,都满足有哈希函数f(key),代入任意key值都可以获取包含该key值的记录在表中的地址

与普通的列表不同的地方在于,普通列表仅能通过下标来获取目标位置的值,而哈希表可以根据给定的key计算得到目标位置的值。

哈希表有什么优势?

通过前面的概念了解,哈希表的优点呼之欲出:通过关键值计算直接获取目标位置,对于海量数据中的精确查找有非常惊人的速度提升,理论上即使有无限的数据量,一个实现良好的哈希表依旧可以保持O(1)的查找速度,而O(n)的普通列表此时已经无法正常执行查找操作(实际上不可能,受到JVM可用内存限制,机器内存限制等)。

散列表是算法在时间和空间上作出权衡的经典例子

如果没有内存限制,我们可以直接将键作为(可能是一个超大的)数组的索引,那么所有查找操作只需要访问内存一次即可完成。但这种理想情况不会经常出现,因为当键很多时需要的内存太大。另一方面,如果没有时间限制,我们可以使用无序数组并进行顺序查找,这样就只需要很少的内存。而散列表则使用了适度的空间和时间并在这两个极端之间找到了一种平衡。事实上,我们不必重写代码,只需要调整散列算法的参数就可以在空间和时间之间作出取舍。我们会使用概率论的经典结论来帮组我们选择适当的参数。

使用Hash的查询算法分为两步:

① 用Hash函数将被查找的键转化为数组的一个索引。
理想情况下,不同的键都能转化为不同的索引值。当然,这只是理想情况,所以我们需要面对两个或者多个键都会散列到相同的索引值的情况。
② 处理碰撞冲突的过程

几种常见的Hash算法:

① 除法哈希法

公式:hash(key) = key mod M   注意:M 通常为“素数”


② 乘法哈希法

公式:hash(key) = floor( M/W * ( a * key mod W) )
其中 floor 表示对表达式进行下取整

③ 斐波那契(Fibonacci)哈希法

也就是当 “乘法哈希法” 的 a ≈ W/φ1/φ ≈ (√5-1)/2 = 0.618 033 988 时情况。而,1/φ ≈ (√5-1)/2 = 0.618 033 988,可称为黄金分割点。



常见的两种解决碰撞的方法

① 拉链法(separate chaining)

 

 

一个Hash函数能够将键转换为数组索引,Hash算法的第二部是碰撞处理,也就是处理两个或多个键的Hash值相同的情况。一种直接的办法是将大小为 M 的数组中的每个元素指向一条链表,链表中的每个结点都存储了Hash值为该元素的索引的键值对。这种方法被称为“拉链法”,因此发生冲突的元素都被存储在一个链表中。


作者:tomas家的小拨浪鼓
链接:https://www.jianshu.com/p/07d9b19bb265
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:Hash,哈希,索引,查找,内存,key
From: https://www.cnblogs.com/xiaoxiaobai2017/p/18016963

相关文章

  • 力扣链表 哈希表 之 146. LRU 缓存
    请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intvalue) ......
  • 线段树维护字符串哈希
    [ABC331F]PalindromeQuery#include<bits/stdc++.h>usingnamespacestd;#defineendl"\n"#defineintlonglongtypedeflonglongll;constintbase=131;constintp1=1222827239;constintN=1e6+100;intn,q,pn[N];strings......
  • PowerShell 的 Get-FileHash 命令查询一个文件的所有上述哈希值(假设是 SHA256, MD5, S
    PowerShell是一种跨平台的任务自动化解决方案,包含一个命令行外壳、脚本语言和配置管理框架。PowerShell提供了用于计算文件哈希值的内置命令Get-FileHash。Get-FileHash命令可以用来计算文件的哈希值,支持多种哈希算法。,Get-FileHash支持以下几种哈希算法:SHA256:默认算法,提......
  • Java 中的哈希表数据结构
    哈希表数据结构HashMap集合:在JDK8之后,如果单向链表中的元素超过8个,单向链表数据结构就会变成红黑树数据结构,当红黑树上的节点数量小于6时,会重新把红黑树变成单向链表数据结构。HashMap集合底层是哈希表/散列表的数据结构哈希表是一个怎样的数据结构?哈希表是一个数组和单向链......
  • 哈希表
    哈希表实现#include<stdio.h>#include<stdlib.h>#include<string.h>#defineHASHTABLE_CAPACITY20//===File:array_hash_map.c===/*键值对int->string*/typedefstruct{ intkey; char*val;}Pair;typedefstruct{ void*set; intlen;......
  • 哈希
    【哈希】哈希可以分成两块:哈希函数和哈希表。哈希函数是一种对应关系,它可以把任意类型映射为一个不太大的整数。例如字符串,我们可能希望在字符串上记录一些属性。但是字符串不能当下标,那我们就只能加个大常数用map。这时,哈希函数出场了!如果我们有一个哈希函数\(h()\)可以把......
  • 哈希碰撞
    哈希碰撞是指两个不同的输入数据在经过哈希函数运算后产生相同的哈希值。哈希函数通常将输入数据映射到一个较小的范围,比如一个固定大小的哈希码空间,但输入数据的范围可能远远大于哈希码空间。因此,多个不同的输入可能映射到相同的哈希码,这就是哈希碰撞的发生。哈希碰撞可能发生在......
  • 哈希表
    哈希表实现#include<stdio.h>#include<stdlib.h>#include<string.h>#defineHASHTABLE_CAPACITY20//===File:array_hash_map.c===/*键值对int->string*/typedefstruct{ intkey; char*val;}Pair;typedefstruct{ void*set; intlen;......
  • 哈希学习笔记
    定义与基本求法定义:用于用一个进制数表示一个字符串,以方便存储和判断两字符串是否相等。基本求法:联系十进制,如\(1234\)即\(1\times10^3+2\times10^2+3\times10+4\)同样的对于一个字符串,去一个大于其中任意字符(\(\text{ASCII}\)码)的数\(base\)作为进制。也就有了......
  • 【板子】字符串哈希
    //lgp3370//Copyrightyeyou26#include<bits/stdc++.h>usingnamespacestd;#defineullunsignedlonglongstrings;intn;constullp=998244353;ullnow_hash;ullv[100005];intcnt;intans;voidget_hash();voiddo_compare();voidinit()......