Golang-map理解

news2024/11/27 21:24:26


golang-map语雀笔记整理

  • map的底层实现
    • hmap
    • bmap
  • map是如何做到O(1)的复杂度的?
    • map扩容策略
  • 师兄问题回答

map的底层实现

hmap

hmap的结构体核心字段有:buckets 桶数组地址, B 定位值,桶的数目是2^B个, count 当前map的总kv对个数, 以及标记是否迁移的 oldbuckets地址,以及迁移进度指标。
image.png

bmap

bmap核心字段是8个kv对;一个tophash数组用来查找时候比对hash值高8位;溢出桶指针指向下一个桶位置,为了保证内存对齐 ,k放在一起,v放在一起。
image.png

go的map解决hash冲突实际是结合了开放地址法和开连法。 具体来说,存的时候首先击中桶数组的某个桶,在桶内采用开放寻址法找空位,找到了就直接存,找不到就开链。 所以go的map宏观上是开链法

map的插入:
首先key经过哈希函数生成64位值,低B位用来确定桶的位置,然后在桶中寻找空位(开放寻址+开链法法),找到空位时插入kv对,更新tophash值为64位的高8位。(插入可能触发扩容机制)

map的查找:
首先key经过哈希函数生成64位值,低B位用来确定桶的位置,然后在桶中用hash值的高8位与tophash数组比对,比对成功后再比对key是否相同(因为仅仅比对高8位可能有错误,所以再比对一次key)。 如果没有找到就去溢出桶中继续找。如果当前的map处于数据迁移状态,会优先到old桶数组中去找,找到的时候会协助迁移。

map是如何做到O(1)的复杂度的?

map扩容策略

当kv对不断的增多,就会造成挂载的mbuckets线性增长,那么map的查找肯定达不到O(1),所以map是通过一个渐进式的扩容来保证每个桶内的kv对在常数级别,从而O(1)

增量式扩容: kv对/ 桶数组长度 > 6.5时发生,扩容,桶数组长度*2
等量式扩容:当map频繁的delete,造成kv对之间存在大量空洞,从而造成溢出桶数目在增加,然而桶内部8个kv对都没有用满,就需要等量扩容。 等量扩容的目的是进行迁移,从而把空洞去掉。 触发时机:溢出桶数 大于 桶数组长度时。 扩容时: 桶数组长度不变。
另外, map的扩容是渐进式扩容。 在查找或者使用的时候进行迁移。 因为一次迁移这个操作态重了,会造成性能抖动。 这也是为什么map的hmap结构体中有 oldbuckets 以及迁移进度变量。

师兄问题回答

  1. 为何map 无序(每次遍历map顺序不一样)
    1. 每次遍历的起始桶位置不一样
    2. map可能处于渐进式扩容状态,导致桶内kv对的位置也在变化
  2. 如何实现有序遍历map
    1. 先取出来key排序,再按照key的顺序遍历map

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

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

相关文章

Java基础(三)——类和对象、构造方法

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 &#x1…

Vue-cli项目及Element UI 环境搭建 保姆级教程

一、Vue-cli介绍及其作用 什么是Vue-cli手脚架 vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目,这个骨架项目就是脚…

环回接口处理 IP 数据报的过程及 Loopback 接口的主要作用

环回接口处理 IP 数据报的过程 IPv4 中 传给环回地址(127.0.0.1)的任何数据均作为 IP 输入,直接送到环回接口(环回:IP 输入队列)。 传给广播地址或多播地址的数据报,会复制一份传给环回接口&…

MySQL高阶:事务和并发

事务和并发 1. 事务创建事务 2. 并发和锁定并发问题 3. 事务隔离等级3.1 读取未提交隔离级别3.2 读取已提交隔离级别3.3 重复读取隔离级别3.4 序列化隔离级别 4. 死锁 1. 事务 事务(trasaction)是完成一个完整事件的一系列SQL语句。这一组SQL语句是一条…

昇思25天学习打卡营第02天 | 快速入门

昇思25天学习打卡营第02天 | 快速入门 文章目录 昇思25天学习打卡营第02天 | 快速入门数据准备网络构建模型训练模型测试迭代数据集模型保存加载模型总结打卡 数据准备 MindSpore通过Dataset和Transforms实现高效的数据预处理 使用download下载数据,并创建数据集对…

Qt项目天气预报(8) - 绘制温度曲线 + 回车搜索(最终篇)

全部内容在专栏: Qt项目 天气预报_mx_jun的博客-CSDN博客 目录 绘制温度曲线 事件过滤器在子控件上绘图 子控件下载事件过滤器 事件过滤器进行绘图 - eventFilter 画初步高温曲线 画初步低温曲线 效果演示 画低温曲线 画高温曲线 效果演示 按下回车搜索: …

LDM论文解读

论文名称:High-Resolution Image Synthesis with Latent Diffusion Models 发表时间:CVPR2022 作者及组织:Robin Rombach, Andreas Blattmann, Dominik Lorenz,Patrick Esser和 Bjorn Ommer, 来自Ludwig Maximilian University of Munich &a…

AI奏响未来乐章:音乐界的革命性变革

AI在创造还是毁掉音乐 引言 随着科技的飞速发展,人工智能(AI)正在逐渐渗透到我们生活的每一个角落,音乐领域也不例外。AI技术的引入,不仅为音乐创作、教育、体验带来了革命性的变革,更为整个音乐产业注入了…

顺序表应用——通讯录

在本篇之前的顺序表专题我们已经学习的顺序表的实现,了解了如何实现顺序表的插入和删除等功能,那么在本篇当中就要学习基于顺序表来实现通讯录,在通讯录当中能实现联系人的增、删、查改等功能,接下来就让我们一起来实现通讯录吧&a…

民用无人机企业招标投标需要资质证书详解

一、基础资质 在民用无人机企业的招标投标过程中,基础资质是首要考虑的因素。这些资质通常包括企业注册资质、税务登记证、组织机构代码证等。 1.1 企业注册资质 企业应具备合法的注册资质,即营业执照。该执照应包含企业名称、注册地址、法定代表人、…

Java [数据结构] Deque与Queue

🤺深入理解 Java 中的 Deque 和 Queue🤺 在现代软件开发中,数据结构是构建高效、可维护代码的基础。 Java 作为一门广泛应用的编程语言,其丰富的集合框架(Collections Framework)为开发者提供了多种强大的…

Zabbix 排坑版 Centos7

systemctl stop firewalld;systemctl disable firewalld;setenforce 0sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configzabbix源地址,可以自己选版本,安装都大差不差 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5…

【车载开发系列】S32 Design Studio工具安装步骤

【车载开发系列】S32 Design Studio工具安装步骤 S32 Design Studio工具安装步骤 【车载开发系列】S32 Design Studio工具安装步骤※关键字提炼※一. 准备工作二. 下载安装包三. 获取License许可四. 开始预安装五. 开始正式安装六. 启动软件七. 安装插件八. 卸载插件九. 确认安…

【操作系统】进程管理——进程控制和进程通信(个人笔记)

学习日期:2024.6.30 内容摘要:进程控制的概念,进程控制相关的“原语”,进程通信 进程控制 原语 进程控制用“原语”实现。原语是一种特殊的程序,它的执行具有原子性,也就是说,这段程序的执行…

vs code python开发笔记

目录 选择python 解析器 安装插件 不全: 调试启动目录问题: 2.选择python解释器 选择python 解析器 ctrl shift P select interpreter 安装插件 不全: remote ssh python debuger 左下角,点击左右左右箭头,远程…

后端之路第三站(Mybatis)——JDBC跟Mybatis、lombok

一、什么是JDBC JDBC就是sun公司研发的一套通过java来操控数据库的工具,对应不同的数据库系统有不同的JDBC,而他们统称【驱动】,这就是上一篇我们提到创建Mybatis项目时要引入的依赖、以及连接数据库四要素里的第一要素。 JDBC有自己一套原始…

Redis 7.x 系列【8】数据类型之哈希(Hash)

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 HSET2.2 HGET2.3 HDEL2.4 HEXISTS2.5 HGETALL2.6 HKEYS2.7 HLE…

grpc学习golang版( 五、多proto文件示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文…

探索MySQL核心技术:理解索引和主键的关系

在数据密集型应用中,数据库的性能往往是决定一个应用成败的重要因素之一。其中,MySQL作为一种开源关系型数据库管理系统,以其卓越的性能和丰富的功能被广泛应用。而在MySQL数据库优化的众多技巧中,索引和主键扮演着极其重要的角色…

5、Python之rich:GUI之外,终端呈现也能玩出花

引言 在Python系列文章的上一篇中,我们从print的定义出发,进一步探索了print()函数更多的用法,尤其是一些哪怕是Python老手也可能忽略的用法。没有阅读的或者需要回顾print()及输出格式化的扩展用法,可以查看上一篇文章。 虽然pr…