数据结构 in Golang:Hash Tables(哈希表)

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

数据结构 in Golang:Hash Tables(哈希表)

场景

  • 水果店的价格表:
    • 苹果 Apple:3元
    • 香蕉 Banana:4元
    • 桃子 Peach:2元
    • 梨 Pear:3元
  • 找到一种水果的价格:
    • 可以使用 binary search,通过名称来查找,耗时:O(logn)
    • 如何只耗时 O(1) 来找到价格呢?

Hash 函数

  • Hash 函数:通过一个字符串 -> 一个数值
  • 例如:
    • "Apple" -> 1
    • "Banana" -> 2
    • "Peach" -> 7
    • "Pear" -> 8
  • 将字符串映射为数值

Hash 函数的要求

  • 一致性
  • 将不同的字符串映射为不同的数值

Hash 函数有什么用?

方便 快捷的得到自己想要的值...文章来源地址https://www.toymoban.com/news/detail-474896.html

Hash Table

  • Hash 函数 + 数组 = Hash Table
  • 数组直接映射到内存
  • Hash Table 具有额外的逻辑,它使用 Hash 函数智能的找到存放元素的位置
  • 在 Go 语言中叫 Map
package main

func main() {
  dict := make(map[string]int)
  dict1 := map[string]int{"Apple": 3, "Orange": 4}
}
  • 其它语言中:Dictionary、Map、Hash Map......

使用场景

  • 电话簿
  • DNS 解析
  • 缓存

冲突

  • 冲突就是:两个 Key 被安排到了同一个位置
  • 也就是说:K1 != K2,但 H(K1) == H(K2)

解决冲突

  • 开放地址法、再 Hash 法、建立公共溢出区 ...
  • 链地址法:链表

注意:

  • Hash 函数应尽可能的将 Key 平均的映射
  • 如果链表过长,会让 Hash Table 变得很慢

选择 Hash 函数

Hash Table 平均 Hash Table 最坏 数组 链表
查找 O(1) O(n) O(1) O(n)

避免冲突

  • 装载因子(load factor)要低
  • 一个好的 Hash 函数

装载因子(load factor)

  • 调整大小,Resize
    • 例如:load factor 为 75% 的时候,就可以调整大小,通常是原来大小的两倍
    • 注意:调整大小也会花费很多时间

选择好的 Hash 函数

  • 好的 Hash 函数会将值尽可能的平均分布在数组中
  • 不好的 Hash 函数经常会把值聚集,并产生很多冲突
  • 通常不需要自己编写 Hash 函数,可以了解 SHA 函数

到了这里,关于数据结构 in Golang:Hash Tables(哈希表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Hive 分区表 (Partitioned Tables) 『 创建分区表 | CRUD分区 | 修复分区 | 数据导入(静态分区、动态分区) | 查询数据/表结构』

    条件:假如现有一个角色表 t_all_hero ,该表中有6个清洗干净的互不干扰的数据文件:射手、坦克、战士、法师、刺客、辅助 要求:查找出名字为射手且生命值大于6000的角色人数 惯性解决方法:按照MySQL思维很容易想到 问:如何提高效率?这样虽然能够解决问题,但是由于要

    2024年02月04日
    浏览(78)
  • Redis Hash数据结构探秘

    在网上看了不少文章都是指导使用方式,要不就是老版本的redis结构,干脆我就自己看源码瞅瞅怎么个事。 本文主要说明的是数据结构和hash的基本操作原理,不是API文档,有想知道的API请自行查阅文档和代码。 : ziplist、hashtable、listpack、rehash、dict。 先说明 ziplist 和

    2024年02月20日
    浏览(41)
  • Redis数据结构之——hash

    以下内容是基于Redis 6.2.6 版本整理总结 Redis中hash数据类型使用了两种编码格式:ziplist(压缩列表)、hashtable(哈希表) 在redis.conf配置文件中,有以下两个参数,意思为:当节点数量小于512并且字符串的长度小于等于64时,会使用ziplist编码。 ziplist 我们整理在下一篇文章。 Redis中的

    2023年04月26日
    浏览(37)
  • Redis之hash数据结构

             Redis的hash数据结构是一个string数据类型的域和值的映射表 ,,hash数据的类型常常用来存储 对象的信息,每个hash数据结构可以存储2^32-1个键值对, 设置的哈希表域的值(HSET):         使用 HSET设置hash表的key中的field的值设置为value,当这个的key不存在的是的,将

    2024年02月11日
    浏览(40)
  • redis的hash数据结构底层简记

    hash:k和v都是string的hash表。 HSET(设置集合数据,4.0之前只能设置1个,之后可以设置多个),HSETNX(若k不存在则设置对应v),HDEL(删除指定kv,可以一次删除多个),DEL(删除Hash对象),HMSET(设置多个kv,4.0之后废弃),HGETALL(查找全部数据),HGET(查询k对应的v),HLEN(查

    2024年02月21日
    浏览(37)
  • Redis数据结构:Hash类型全面解析

    Redis,作为一个开源的、内存中的数据结构存储系统,以其出色的性能和灵活的数据类型,广泛应用于缓存、消息队列、发布订阅系统等多种场景。在 Redis 的五种基本数据类型中,Hash 类型是一种非常重要的数据类型。它可以存储键值对的集合,且能够用小于1毫秒的时间复杂

    2024年02月10日
    浏览(38)
  • 数据结构-哈希-哈希表实现

    🚀理想的搜索方法:不经过任何的比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数使元素的存储位置与其关键码之间能够建立起一一映射的关系,那么在查找的时候就能通过此函数快速的找到该元素。 🚀向该结构中插入元素:根据该元素的

    2024年02月10日
    浏览(36)
  • 【数据结构】哈希底层结构

    目录 一、哈希概念 二、哈希实现 1、闭散列 1.1、线性探测 1.2、二次探测 2、开散列 2.1、开散列的概念 2.2、开散列的结构 2.3、开散列的查找 2.4、开散列的插入 2.5、开散列的删除 3、性能分析  顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查

    2024年02月06日
    浏览(45)
  • 【数据结构】哈希表与哈希桶

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》 《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.概念 2.哈希冲突 3.解决哈希冲突 3.1闭散列 3.2开散列(哈希桶) 4.模拟实

    2024年03月21日
    浏览(44)
  • 「数据结构」哈希表2:实现哈希表

    🎇 个人主页 :Ice_Sugar_7 🎇 所属专栏 :Java数据结构 🎇 欢迎点赞收藏加关注哦! 在讲插入之前需要先了解扩容,因为 插入后载荷因子如果超过阈值,那我们就要扩容,即扩容是插入操作的一部分 扩容后,原先哈希表中的元素的哈希地址会改变。之前会发生哈希冲突的元素

    2024年02月21日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包