HELLO算法笔记之散列表(哈希)

这篇具有很好参考价值的文章主要介绍了HELLO算法笔记之散列表(哈希)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、哈希表

建立键 key 与值 value 之间的映射,实现高效的元素查询。输入一个key,以O(1)获取对应的value

遍历:

# 遍历哈希表
# 遍历键值对 key->value
for key, value in mapp.items():
    print(key, "->", value)
# 单独遍历键 key
for key in mapp.keys():
    print(key)
# 单独遍历值 value
for value in mapp.values():
    print(value)

知识点1、哈希函数:

将一个较大的输入空间映射到一个较小的输出空间。在哈希表中,输入空间是所有 key ,输出空间是所有桶(数组索引)。换句话说,输入一个 key ,我们可以通过哈希函数得到该 key 对应的键值对在数组中的存储位置

输入一个 key ,哈希函数的计算过程分为两步:首先,通过哈希算法 hash() 计算得到哈希值;接下来,将哈希值对桶数量(数组长度)capacity 取模,从而获取该 key 对应的数组索引 index 。

index = hash(key) % capacity

HELLO算法笔记之散列表(哈希)

 

每个桶都放着一个键值对

buckets[index] =Pair(key, val)

知识点2、哈希冲突和扩容

存在“多个输入对应相同输出”的情况,可以通过扩容哈希表来减少哈希冲突

HELLO算法笔记之散列表(哈希)

 类似于数组扩容,哈希表扩容需将所有键值对从原哈希表迁移至新哈希表,非常耗时。并且由于哈希表容量 capacity 改变,我们需要重新计算所有键值对的存储位置,进一步提高了扩容过程的计算开销。

「负载因子 Load Factor」是一个重要概念,其定义为哈希表的元素数量除以桶数量,为了衡量哈希冲突的严重程度,也常被作为哈希表扩容的触发条件。例如在 Java 中,当负载因子超过 0.75 时,系统会将哈希表容量扩展为原先的 2 倍。

二、哈希冲突

  1. 改良哈希表数据结构,使得哈希表可以在存在哈希冲突时正常工作
  2. 仅在必要时,即当哈希冲突比较严重时,执行扩容操作。

哈希表的结构改良方法主要包括链式地址和开放寻址。

哈希表的结构改良方法一:链式地址

将单个元素转换为链表,将键值对作为链表节点,将所有发生冲突的键值对都存储在同一链表中。每个桶都是一个列表/链表

HELLO算法笔记之散列表(哈希)

 

  • 查询元素:输入 key ,经过哈希函数得到数组索引,即可访问链表头节点,然后遍历链表并对比 key 以查找目标键值对。
  • 添加元素:先通过哈希函数访问链表头节点,然后将节点(即键值对)添加到链表中。
  • 删除元素:根据哈希函数的结果访问链表头部,接着遍历链表以查找目标节点,并将其删除。

哈希表的结构改良方法二:开放寻址

「开放寻址 Open Addressing」不引入额外的数据结构,而是通过“多次探测”来处理哈希冲突,探测方式主要包括线性探测、平方探测、多次哈希。

HELLO算法笔记之散列表(哈希)

 

线性探测存在以下缺陷:

  • 不能直接删除元素。删除元素会在数组内产生一个空位,查找其他元素时,该空位可能导致程序误判元素不存在。因此,需要借助一个标志位来标记已删除元素。(查找的时候是遍历整个表的,如果遇到none就会返回不存在)(开放寻址法都会有不能直接删除元素的缺陷。)
  • 容易产生聚集。数组内连续被占用位置越长,这些连续位置发生哈希冲突的可能性越大,进一步促使这一位置的“聚堆生长”,最终导致增删查改操作效率降低。

对哈希的解释:对 1 个对象进行 Hash,就可以得到这个对象的一个映射值,这个映射值其实就是 Hash 值,这值转换存到数组的某个位置中,就是放到桶中。

三、哈希算法

无论是开放寻址还是链地址法,它们只能保证哈希表可以在发生冲突时正常工作,但无法减少哈希冲突的发生

一些简单的哈希算法:

  • 加法哈希:对输入的每个字符的 ASCII 码进行相加,将得到的总和作为哈希值。
  • 乘法哈希:利用了乘法的不相关性,每轮乘以一个常数,将各个字符的 ASCII 码累积到哈希值中。
  • 异或哈希:将输入数据的每个元素通过异或操作累积到一个哈希值中。
  • 旋转哈希:将每个字符的 ASCII 码累积到一个哈希值中,每次累积之前都会对哈希值进行旋转操作。

当我们使用大质数作为模数时,可以最大化地保证哈希值的均匀分布

哈希表的 key 可以是整数、小数或字符串等数据类型。编程语言通常会为这些数据类型提供内置的哈希算法,用于计算哈希表中的桶索引。文章来源地址https://www.toymoban.com/news/detail-498171.html

  • 在哈希表中,我们希望哈希算法具有确定性、高效率和均匀分布的特点。在密码学中,哈希算法还应该具备抗碰撞性和雪崩效应。
  • 通常情况下,只有不可变对象是可哈希的。

到了这里,关于HELLO算法笔记之散列表(哈希)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hello算法学习笔记之搜索

    一、二分查找 1.从数组中找到target的索引  注意:while条件是=  O(logn) 二分查找并非适用于所有情况,原因如下: 二分查找仅适用于有序数据。若输入数据无序,为了使用二分查找而专门进行排序,得不偿失。因为排序算法的时间复杂度通常为 (O(n log n)) ,比线性查找

    2024年02月11日
    浏览(36)
  • 哈希表(散列表)详解

    💕**今天的每一秒都是珍贵的,因为它永远不会再次出现。**💕 🐼作者:不能再留遗憾了🐼 🎆专栏:Java学习🎆 🚗本文章主要内容:深入理解哈希表(散列表),散列函数的几种构造方法以及解决哈希冲突的方法。🚗 前面我们可能都了解过如何查找数据,一开始一般将

    2024年02月06日
    浏览(28)
  • 散列表(哈希表)知识详解

    1.1 散列表查找定义 散列技术是在记录的存储位置和它的之间建立一个确定的对应关系 f 使得每个 key 对应一个存储位置 f(key)。 查找时,根据这个确定的关系找到给定值 key 的映射 f(key),若查找集合中存在这个记录,则必定在 f(key)位置上。 我们把这种 对应关系

    2024年02月07日
    浏览(25)
  • 哈希表-散列表数据结构

    哈希表也叫散列表,哈希表是根据关键码值(key value)来直接访问的一种数据结构,也就是将关键码值(key value)通过一种映射关系映射到表中的一个位置来加快查找的速度,这种映射关系称之为哈希函数或者散列函数,存放记录的数组称之为哈希表。 哈希表采用的是一种转换思

    2024年01月21日
    浏览(43)
  • 查找-散列表(哈希表)详解篇

    总结 性能总结

    2024年02月14日
    浏览(26)
  • 哈希表/散列表(HashTable)c++实现

    目录 哈希表实现的思想 除留余数法  哈希冲突 第一种方法:探测法实现哈希表 探测法的思想  结点类  插入数据(insert) 冲突因子 数据扩容 哈希值  插入的代码实现以及哈希类 查找数据(find) 删除数据(erase) 第二种方法:拉链法实现哈希表 结点类 哈希类的成员 插入(insert)

    2024年02月10日
    浏览(35)
  • 【数据结构(C++版)】哈希表(散列表)

    目录   1. 散列表的概念 2. 散列函数的构造方法 2.1 直接定址法 2.2 除留余数法 2.3 数字分析法 2.4 平方取中法 3. 处理冲突的方法 3.1 开放定址法 3.1.1 线性探测法 3.1.2 平方探测法 3.1.3 双散列法 3.1.4 伪随机序列法 3.2 拉链法(链接法) 4. 散列查找及性能分析 5. 哈希的应用 5.1 位

    2024年02月15日
    浏览(38)
  • 哈希表(散列表)的平均查找成功/失败长度

    计算哈希地址的方法,称之为哈希函数。 常见的计算哈希地址方法有: 1、直接定址法 2、除留余数法 3、数字分析法 4、平方取中法 本文所分析的是使用除留余数法计算哈希地址这类,的平均查找成功长度和查找失败长度 对于除留余数法的哈希函数(散列函数) H(key) = key

    2024年02月07日
    浏览(35)
  • Java学数据结构(4)——散列表Hash table & 散列函数 & 哈希冲突

    1.散列表,key,散列函数; 2.哈希冲突的解决; 3.string中的hashCode; 查找树ADT,它允许对元素的集合进行各种操作。本章讨论散列表(hash table)ADT,不过它只支持二叉查找树所允许的一部分操作。散列表的实现常常叫作散列(hashing)。散列是一种用于以常数平均时间执行插入、删除和

    2024年02月10日
    浏览(47)
  • 一篇就能学懂的散列表,让哈希表数据结构大放光彩

    目录 1.散列表的基本概念 2.散列表的查找 3.散列函数的构造方法 1.直接定址法 2.除留余数法 4.散列表解决冲突的方法 1.开放定址法 2.链地址法 基本思想 :记录的存储位置与之间存在的对应关系 对应关系——hash函数 Loc(i) = H(keyi) Hash:哈希——翻译为:散列、杂凑(感

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包