Golang 哈希表底层实现原理

1、本文讨论Golang的哈希表

Golang哈希表的实现,底层数据结构是数组+单链表,链表节点由8个key、value和键的高八位组成的。为了方便理解,先简单看一个图快速理解。
在这里插入图片描述

我们来看一下Golang哈希表的结构体定义
在这里插入图片描述

简单介绍一下结构体中几个关键的字段,hmap结构体就是Golang哈希表的底层结构体。

buckets为 哈希表 底层实际存储哈希表数据(数组+单链表)的指针变量

oldbuckets,也是存储哈希表数据(数组+单链表)的指针变量。但是,这个oldbuckets是用来存储 旧数据 的,用于在哈希表扩容时,渐进式扩容使用的,渐进式扩容结束时,oldbuckets指向的数据会被删除。后面我们再说扩容的事情。

count 表示当前哈希表中的元素数量,有一个很重要的意义就是,可以通过count知道渐进式扩容什么时候结束

hash0是哈希值的随机种子,这些都不是很重要。

extra是存储溢出桶的,溢出桶其实也是数组+单链表,可以简单理解成它的目的,是为了降低扩容频率而产生的

什么是桶,笔者理解其实就是那个底层数组。。。

介绍完关键几个字段,我们再看一张图便于理解

在这里插入图片描述

可以看到buckets指向的是一个数组,那么数组元素bmap就是一个“单链表”,所以才说Golang哈希表是数组+单链表,我们来看看bmap的数据结构

在这里插入图片描述

链表节点由8个keyvalue键的高八位组成的,overflow是指向下一个节点的指针,topbits就是8个键的高八位,作用是为了加速查找

其实到这里,你已经明白了哈希表整体的结构,那么我们来说说Golang哈希表是什么时候触发扩容扩容行为是什么

2、什么时候触发扩容

(1)溢出桶过多,也就是底层数组过长的时候
(2)负载因子达到某个阈值的时候

为什么溢出桶过多,也会触发扩容行为?

因为当溢出桶过多,但是桶中数据很少的时候。因为这时候键值对比较分散查找性能比较差,需要将键值对聚集一下

3、扩容行为有什么

(1)等量扩容

等量扩容,就是溢出桶过多,也就是底层数组过长的时候触发的,只是把键值对存储的更密集一些

(2)翻倍扩容

创建两倍桶数量两倍数组长度),然后将旧数据渐进式扩容的方式迁移旧数据,新数据直接写到新的桶中,我们看一个图方便理解,什么时候结束扩容?我们之前说了一个count字段,我们记录一下迁移了多少个,就知道是否完全迁移结束了

在这里插入图片描述

什么是渐进式扩容

①就是不一次性把数据复制过去,如果数据量多大,会短时间消耗大量性能

②首先把扩容前的桶标记为旧桶,
----1)查找操作,先看对应桶是否已经迁移没有迁移查旧桶,然后把对应桶数据迁移过去,迁移次数-1,如果迁移次数为0,就表示整个哈希表完成了迁移

更新、删除操作类似,先看是否完成迁移,没有迁移,先在旧桶完成迁移,再到新桶进行相应操作。

写文不易,给个点赞关注吧哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#的await常用和扩展方法

await 是 C# 中用于等待异步操作完成的关键字。它通常与 async 一起使用,用于异步方法中等待异步操作的完成,并且在异步操作完成后,恢复执行该方法。 下面是对 await 的详细介绍以及一些示例代码: 1. 基本用法: await…

(C语言) fgetc与fputc函数详解

目录 1 fgetc函数详解 1.1 从文件流中读取数据 1.2 从标准输入流中读取数据 2 fputc函数详解 2.1 向文件流中写入数据 2.2 向标准输出流中写入数据 1 fgetc函数详解 头文件:stdio.h 该函数只有一个参数:stream 作用:从输入流中获得一个…

函数调用实现小米汽车智能语音助手

上周小米汽车发布,其中有一个特色功能就是智能语音,小爱同学整合了语音大模型,实现智能座舱体验。 雷老板的PPT也演示了,一些口语化的对话就能触发各种指令,无论是开空调、播放音乐,还是找手机、识别前方汽…

strlen与sizeof区别

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是取字节运算符(关键字),strlen是函数。 3.sizeof可以用类型做参数,strlen只能…

PyTorch学习之:深入理解神经网络

使用torch.nn模块构建网络架构 在PyTorch中,torch.nn模块是构建神经网络的核心。使用这个模块,你可以轻松地定义网络层、激活函数、损失函数等。以下是使用torch.nn构建一个简单神经网络架构的步骤: 步骤1: 定义网络结构 首先,…

STC8H8K64U 学习笔记 - 与上位机通信

与上位机通信 在天问中编程,通过分支判断来接收 PyQt 的传递的信号,进而控制单片机的点灯操作。 环境说明 该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。 芯片:STC8H8K64U烧录…

C++ 让类只在堆或栈上分配

1. 让类只在栈上或堆上分配内存 在C中,类的对象建立分为两种: 一种是静态建立,如A a; 另一种是动态建立,如A* ptrnew A;这两种方式是有区别的。 1、静态建立类对象:是由编译器为对象在栈空间…

掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)

在Go语言中,类型转换指的是将一个数据类型的值转换为另一个数据类型的过程。Go语言中的类型转换通常用于将一种数据类型转换为另一种数据类型,以满足特定操作或需求。 类型转换的基本语法 在Go语言中,类型转换的基本语法为: ne…

Redis Stack 安装部署

参考:Run Redis Stack on Docker | Redis Redis-stack 初体验_redis stack-CSDN博客 【docker】运行redis_docker run redis-stack-server requirepass-CSDN博客 Redis Stack 是一组软件套件,它主要由三部分组成。 一个是 Redis Stack Server&#x…

艺术点亮新乡村--博罗县“村ART“乡村艺术创作大赛圆满落幕

三月的博罗大地春意盎然,处处洋溢着勃勃生机。在这万物复苏、欣欣向荣的美好时节,一场由农民自编自演、自导自绘的乡村文化盛宴在古朴幽静的徐田村徐徐拉开帷幕。由博罗县委宣传部倾情指导,县文联、文广旅体局、文明办通力合作,泰康保险集团鼎力承办的"村ART"乡村艺术…

AI技术创业:探索无限商机与创新之路

AI技术创业在当前数字化时代呈现出蓬勃发展的态势,为创业者提供了广阔的机会和无限的可能性。随着AI技术的不断进步和应用领域的拓展,从智能家居到自动驾驶,从医疗健康到金融服务,几乎每一个行业都在积极拥抱AI,寻求创…

多功能知识付费源码下载-实现流量互导多渠道变现(带详细安装教程)

资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档、会员、社群、用户发布、创作分成、任务裂变、流量主、在线…

MySQL DBA 需要了解一下 InnoDB Online DDL 算法更新

在 MySQL 8.0.12 中,我们引入了一种新的 DDL 算法,该算法在更改表的定义时不会阻塞表。第一个即时操作是在表格末尾添加一列,这是来自腾讯游戏的贡献。 然后在 MySQL 8.0.29 中,我们添加了在表中任意位置添加(或删除&…

14种建模语言(UML)图形

前言 UML 中有四种关系:依赖、关联、泛化和实现。这四种关系是 UML 模型中可以包含的基本关系事物。这里介绍14种UML图形:类图,对象图,包图,构件图,组合结构图,部署图,制品图,用例图…

sql之每日五题day02--多表联查/聚合函数/多值判断/函数

sql之每日五题day01--多表联查/聚合函数 where和group by同时出现分别查看&结果不去重--union allunion all细节别名case when多值判断数据处理函数 where和group by同时出现 SQL24 统计每个用户的平均刷题数 仅查看山东大学的用户在不同难度下的每个用户的平均答题题目数…

DNDC模型对所有处理的土壤温度和湿度模拟效果良好,但有时土壤湿度模拟存在偏差

使用 DNDC 模型评估加拿大多样化作物轮作系统对产量和 N2O 排放的影响 原名:Assessing the impacts of diversified crop rotation systems on yields and nitrous oxide emissions in Canada using the DNDC model 译名:使用 DNDC 模型评估加拿大多样…

爬虫逆向实战(39)-某某兔装修网登陆(RSA)

一、数据接口分析 主页地址:某某兔装修网 1、抓包 通过抓包可以发现登陆是表单提交 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块,可以发现有一个val和password的加密参数 请求头是否加密? 无响应是否加密…

vue 实现自定义分页打印 window.print

首先这里是我自定义了打印界面才实现的效果,如果不用自定义界面实现,应该是一样的吧。具体可能需要自己去试试看 我的需求是界面有两个表格,点击全部打印,我需要把第一表格在打印是第1页,第二个表格是第二页 如图&…

大宋咨询(深圳舆情监控)政府舆情调查介绍

公众舆论调查旨在收集和分析普通大众对各种主题和问题的观点、态度和意见,它可以帮助政府部门了解公众的意见和情绪,为政策制定和决策提供参考。这些调查旨在了解人群的集体情绪和偏好,并提供公众舆论的见解。 公众舆论调查可以涵盖广泛的主…