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,就表示整个哈希表完成了迁移

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue在线考试系统设计与实现+搭建视频

介绍 该在线考试系统共包含三种角色,分别是:学生、老师和管理员,不同角色对系统的功能需求也不同。 具体功能如下: 1)学生 考生注册、考生登录、在线考试、我的成绩、我的题库、修改个人资料等功能。 2&#xff0…

网络攻防中之url跳转过程分析和使用欺骗方法生成自己的恶意链接过程,以及点击劫持和绕过验证的几种方式

网络攻防中之url跳转过程分析和使用欺骗方法生成自己的恶意链接过程,以及点击劫持和绕过验证的几种方式。 URL跳转过程分析 URL跳转是Web应用中常见的一种行为,它通常通过HTTP重定向来实现。在网络攻防中,分析URL跳转过程对于理解应用的行为和识别潜在的安全漏洞至关重要。 …

吴恩达2022机器学习专项课程(一) 4.6 运行梯度下降第一周课程实验:线性回归的梯度下降算法

问题预览/关键词 更新梯度下降对模型拟合,等高线图,3d空间图的变化。什么是批量梯度下降。实验目标计算梯度运行梯度下降梯度下降迭代次数和成本函数的关系可视化模型预测在等高线图上的梯度下降学习率过大报错问题 笔记 1.模型拟合,等高线…

怎么修改图片的创建日期和修改日期?

怎么修改图片的创建日期和修改日期?大家都应该知道,电脑上的任何一种文件都有创建日期和修改日期,不管word、excel、ppt还是图片,这两个时间属性是都必须具备的。在数字时代,我们经常使用照片来记录珍贵的时刻和重要的…

VISA、masterCard卡进行USDT消费,无需实名,0年费,0月费

开卡流程 1、点击获取卡 2、注册之后点击“流量钱包->点击点此充值” 3、选择积分充值点击确认即可 在返回到首页点击申请卡,选择534786与556150都可以,选择钱包支付即可 点击获取卡片

【Java代码审计】SpEL表达式注入篇

【Java代码审计】SpEL表达式注入篇 1.SpEL 介绍2.SpEL漏洞概述3.SpEL漏洞演示4.SpEL漏洞修复 1.SpEL 介绍 Spring 表达式语言是一种功能强大的表达式语言,用于在运行时查询和操作对象视图,语法上类似于 Unified EL,但提供了更多的特性&#…

Flutter应用在苹果商店上架前的准备工作与注意事项

引言 🚀 Flutter作为一种跨平台的移动应用程序开发框架,为开发者提供了便利,使他们能够通过单一的代码库构建出高性能、高保真度的应用程序,同时支持Android和iOS两个平台。然而,完成Flutter应用程序的开发只是第一步…

【Servlet】继承关系以及service方法

文章目录 一、继承关系二、相关方法 一、继承关系 Servlet接口下有一个GenericServlet抽象类。在GenericServlet下有一个子类HttpServlet,它是基于http协议。 继承关系 javax.servlet.Servlet接口​ javax.GenericServlet抽象类​ javax.servlet.http.HttpServ…

毕马威:《智慧之眼:开启汽车感知新时代》

在全球科技飞速发展和产业革新的大潮中,汽车产业正在以前所未有的速度向网联化、智能化的方向转型。汽车传感器作为智能联网汽车发展的关键环节之一,扮演着举足轻重的角色。 毕马威一直关注汽车产业的变化与发展,为了更好地为汽车行业赋能&a…

python 哔哩哔哩视频去水印

使用python 去除视频中的水印 1. 需要安装的包 pip install moviepy pip install numpy pip install opencv_python pip install tqdm 2. 代码 import cv2 import numpy as np import glob from moviepy.editor import VideoFileClip import os from tqdm import tqdm# 判…

第九届全国大学生GIS应用技能大赛试题答案及数据下载(下午)

一、案例背景 我们现在是江苏省城市研究科研项目组的一员,我们分配到了以下任务: **任务一:**创建三甲医院 20 分钟、45 分钟服务区,并计算每一个地级市/县级市拥有的三甲医院 20 钟、45 分钟服务区占全市面积百分比。 **任务二&a…

ERROR: No matching distribution found for sklearn.cross_validation

问题 ERROR: Could not find a version that satisfies the requirement sklearn.cross_validation (from versions: none) ERROR: No matching distribution found for sklearn.cross_validation 错误:找不到满足sklearn要求的版本。Cross_validation (from versions: none)…

Nginx开发实战三:替换请求资源中的固定数据

文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址,我们通过nginx可以很便捷的将其改为外网访问,但是在外网访问这个地址后&#xff0c…

算法之美:二叉堆原理剖析及堆应用案例讲解及实现

什么是堆 堆(Heap)是计算机科学中一类特殊的数据结构,通常是一个可以被看做一棵完全二叉树的数组对象。 完全二叉树 只有最下面两层节点的度可以小于2,并且最下层的叶节点集中在靠左连续的边界,只允许最后一层有空缺结点且空缺在右边&#x…

工艺品wordpress外贸主题

工艺品wordpress外贸主题 简约大气的wordpress外贸主题,适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求,要在每天凌晨5点的时候执行一个任务,获取一系列的PDF文件并解析。 后端是Django框架,定时任务用Celery来实现的。 本地跑没什么问题,但是一放到服务器上跑就会宕机,而且是毫无征兆的宕机,…

前端学习<二>CSS基础——17-CSS3的常见边框汇总

CSS3 常见边框汇总 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>CSS3 边框</title><style>body, ul, li, dl, dt, dd, h1, h2, h3, h4, h5 {margin: 0;padding: 0;}​body {background-c…

erp系统开发报价:企业如何选择一套合适的智能erp管理系统-亿发

在选择ERP系统时&#xff0c;企业通常希望了解上一套系统到底需要多少资金&#xff0c;但实际上这个问题并没有一个明确的答案。一般的erp系统从几万到几百万不等&#xff0c;一些简单的erp系统甚至只需要几千元。ERP系统的价格取决于多种因素&#xff0c;包括企业的业务规模、…

Linux多进程通信(1)——无名管道及有名管道使用例程

管道是半双工通信&#xff0c;如果需要 双向通信&#xff0c;则需要建立两个管道&#xff0c; 无名管道&#xff1a;只能父子进程间通信&#xff0c;且是非永久性管道通信结构&#xff0c;当它访问的进程全部终止时&#xff0c;管道也随之被撤销 有名管道&#xff1a;进程间不需…

【算法刷题day14】二叉树理论基础、递归遍历、迭代遍历、统一迭代

二叉树理论基础 题目分类 二叉树的种类 无数值两种&#xff1a;满二叉树 和 完全二叉树 有数值&#xff1a;二叉搜索树 1.若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值; 2.若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点…