Golang | HashMap实现原理

在这里插入图片描述
在这里插入图片描述

  • HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作。其核心原理如下:
    • 哈希函数:将键转换为数组索引。理想情况下,不同键应映射到不同索引,但冲突难以避免。
    • 数组+链表:使用数组作为桶(Bucket),每个桶是一个链表,解决哈希冲突(链地址法)。
    • 动态扩容:当元素数量超过容量与负载因子的乘积时,扩容并重新分配元素,保持操作高效性。
package mainimport "fmt"// Entry 键值对链表节点
type Entry struct {Key   stringValue interface{}Next  *Entry
}// HashMap 哈希表结构
type HashMap struct {buckets    []*Entry // 桶数组capacity   int      // 初始容量size       int      // 元素数量loadFactor float64  // 负载因子
}// NewHashMap 初始化哈希表
func NewHashMap(capacity int) *HashMap {return &HashMap{buckets:    make([]*Entry, capacity),capacity:   capacity,loadFactor: 0.75,}
}// hash 哈希函数(FNV-1a算法)
func (h *HashMap) hash(key string) int {const (offset = 2166136261prime  = 16777619)hash := offsetfor _, c := range key {hash ^= int(c)hash *= prime}return hash
}// getIndex 计算键对应的桶索引
func (h *HashMap) getIndex(key string) int {return h.hash(key) % h.capacity
}// Put 插入键值对
func (h *HashMap) Put(key string, value interface{}) {if float64(h.size)/float64(h.capacity) >= h.loadFactor {h.resize()}index := h.getIndex(key)entry := h.buckets[index]// 遍历链表查找键是否存在for entry != nil {if entry.Key == key {entry.Value = value // 存在则更新return}entry = entry.Next}// 不存在则插入链表头部h.buckets[index] = &Entry{Key:   key,Value: value,Next:  h.buckets[index],}h.size++
}// Get 获取值
func (h *HashMap) Get(key string) (interface{}, bool) {index := h.getIndex(key)entry := h.buckets[index]for entry != nil {if entry.Key == key {return entry.Value, true}entry = entry.Next}return nil, false
}// Delete 删除键
func (h *HashMap) Delete(key string) bool {index := h.getIndex(key)entry := h.buckets[index]var prev *Entryfor entry != nil {if entry.Key == key {if prev == nil {h.buckets[index] = entry.Next // 删除头节点} else {prev.Next = entry.Next // 中间或尾部节点}h.size--return true}prev = entryentry = entry.Next}return false
}// resize 扩容哈希表
func (h *HashMap) resize() {newCapacity := h.capacity * 2newBuckets := make([]*Entry, newCapacity)for i := 0; i < h.capacity; i++ {entry := h.buckets[i]for entry != nil {next := entry.NextnewIndex := h.hash(entry.Key) % newCapacity // 重新计算索引entry.Next = newBuckets[newIndex]          // 插入新桶头部newBuckets[newIndex] = entryentry = next}}h.buckets = newBucketsh.capacity = newCapacity
}func main() {hm := NewHashMap(2) // 初始容量设为2便于触发扩容hm.Put("name", "Alice")hm.Put("age", 30)hm.Put("lang", "Go") // 触发扩容if val, ok := hm.Get("name"); ok {fmt.Println("name:", val) // 输出 Alice}hm.Delete("age")if _, ok := hm.Get("age"); !ok {fmt.Println("age deleted") // 输出此句}
}

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

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

相关文章

vue3学习之防抖和节流

​ 在前端开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;某些事件&#xff08;如滚动、输入、点击等&#xff09;会频繁触发&#xff0c;如果不加以控制&#xff0c;可能会导致性能问题。Vue3 中的防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&a…

4.2.2 MySQL索引原理以及SQL优化

文章目录 4.2.2 MySQL索引原理以及SQL优化1. 索引与约束1. 索引是什么2. 索引的目的3. 几种索引4. 约束1.外键2. 约束 vs 索引的区别 5. 索引实现1. 索引存储2. 页3. B树4. B树层高问题5. 自增id6. 聚集索引7. 辅助索引 8. innnodb体系结构1. buffer pool2. change buffer 9. 最…

【学习笔记】文件包含漏洞--本地远程包含、伪协议、加密编码

一、文件包含漏洞 和SQL等攻击方式一样&#xff0c;文件包含漏洞也是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行。 什么叫包含呢&#xff1f;以PHP为例&#xff0c;我们常常把可重复使用的函数写入到单个文件中&…

蓝桥杯 2021年模拟赛 扫雷问题

题目&#xff1a; 在一个 n 行 m 列的方格图上有一些位置有地雷&#xff0c;另外一些位置为空。 请为每个空位置标一个整数&#xff0c;表示周围八个相邻的方格中有多少个地雷。 输入描述 输入的第一行包含两个整数 n,m。 第 22行到第n1 行每行包含 m 个整数&#xff0c;相…

写windows服务日志-.net4.5.2-定时修改数据库中某些参数

环境&#xff1a; windows 11 Visual Studio 2015 .net 4.5.2 SQL Server 目的&#xff1a; 定时修改数据库中某些参数的值 定时修改24小时内&#xff0c;SQL数据库中&#xff0c;表JD_Reports 内&#xff0c;如果部门是‘体检科&#xff0c;设置打印类型为 1 可以打印。步骤&a…

madvise MADV_FREE对文件页统计的影响及原理

一、背景 madvise系统调用是一个与性能优化强相关的一个系统调用。madvise系统调用包括使用madvise函数&#xff0c;也包含使用posix_fadvise函数。如我们可以使用posix_fadvise传入POSIX_FADV_DONTNEED来清除文件页的page cache以减少内存压力。 这篇博客里&#xff0c;我们…

于键值(KV)的表

基于键值&#xff08;KV&#xff09;的表 将行编码为键值&#xff08;KVs&#xff09; 索引查询&#xff1a;点查询和范围查询 在关系型数据库中&#xff0c;数据被建模为由行和列组成的二维表。用户通过SQL表达他们的意图&#xff0c;而数据库则神奇地提供结果。不那么神奇的…

2025年邵阳市工程技术研究中心申报流程、条件、奖补

一、邵阳市工程技术研究中心申报条件 &#xff08;一&#xff09;工程技术研究中心主要依托科技型企业组建&#xff0c;依托单位应具有以下条件&#xff1a; 1. 具有较强技术创新意识的领导班子和技术水平高、工程化实践经验丰富的工程技术研发队伍&#xff0c;其中固定人员…

Python+AI提示词出租车出行轨迹预测:梯度提升GBR、KNN、LR回归、随机森林融合及贝叶斯概率异常检测研究

原文链接&#xff1a;tecdat.cn/?p41693 在当今数字化浪潮席卷全球的时代&#xff0c;城市交通领域的海量数据如同蕴藏着无限价值的宝藏等待挖掘。作为数据科学家&#xff0c;我们肩负着从复杂数据中提取关键信息、构建有效模型以助力决策的使命&#xff08;点击文末“阅读原文…

系统重装——联想sharkbay主板电脑

上周给一台老电脑重装系统系统&#xff0c;型号是lenovo sharkbay主板的电脑&#xff0c;趁着最近固态便宜&#xff0c;入手了两块长城的固态&#xff0c;装上以后插上启动U盘&#xff0c;死活进不去boot系统。提示 bootmgr 缺失&#xff0c;上网查了许久&#xff0c;终于解决了…

python连接Elasticsearch并完成增删改查

python库提供了elasticsearch模块,可以通过以下命令进行快速安装,但是有个细节需要注意一下,安装的模块版本要跟es软件版本一致,此处举例:7.8.1 pip install elasticsearch==7.8.1 首先连接elasticsearch,以下是免密示例 from elasticsearch import Elasticsearch# El…

PDF嵌入图片

所需依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>9.0.0</version><type>pom</type> </dependency>源码 /*** PDF工具*/ public class PdfUtils {/*** 嵌入图…

目标检测篇---faster R-CNN

目标检测系列文章 第一章 R-CNN 第二篇 Fast R-CNN 目录 目标检测系列文章&#x1f4c4; 论文标题&#x1f9e0; 论文逻辑梳理1. 引言部分梳理 (动机与思想) &#x1f4dd; 三句话总结&#x1f50d; 方法逻辑梳理&#x1f680; 关键创新点&#x1f517; 方法流程图关键疑问解答…

Seaborn模块练习题

1.使用tips数据集&#xff0c;创建一个展示不同时间段(午餐/晚餐)账单总额分布的箱线图 import seaborn as sns import matplotlib.pyplot as plt import pandas as pdsns.set_style("darkgrid") plt.rcParams["axes.unicode_minus"] Falsetips pd.read…

计算机网络 | 应用层(1)--应用层协议原理

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记 关注我&#x1f339;&#xff0c;和我一起学习更多计算机的知识 &#x1f51d;&#x1f51d;&#x1f51d; 目录 1. 应用层协议原理 1.1 …

论文导读 - 基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断

基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断 原论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0925400521014830 引用此论文&#xff08;GB/T 7714-2015&#xff09;&#xff1a; WANG T, ZHANG H, WU Y, …

React中createPortal 的详细用法

createPortal 是 React 提供的一个实用工具&#xff0c;用于将 React 子元素渲染到 DOM 中的某个位置&#xff0c;而该位置与父组件不在同一个 DOM 层次结构中。这在某些特殊场景下非常有用&#xff0c;比如实现模态框、弹出菜单、固定定位元素等功能。 基本语法 JavaScript …

电池的寿命

思路&#xff1a; 首先&#xff0c;我们观察发现&#xff1a;由于每枚电池的使用时间不同&#xff0c;而我们又要减少浪费才能使所有电池加起来用得最久&#xff0c;不难发现&#xff1a;当n2时&#xff0c;输出较小值。 第一步&#xff1a;将电池分为两组&#xff0c;使两组…

LeetCode每日一题4.27

3392. 统计符合条件长度为 3 的子数组数目 问题 问题分析 统计符合条件的长度为 3 的子数组数目。具体条件是&#xff1a;子数组的第一个数和第三个数的和恰好为第二个数的一半。 思路 遍历数组&#xff1a;由于子数组长度固定为 3&#xff0c;我们可以通过遍历数组来检查每…

Linux日志处理命令多管道实战应用

全文目录 1 日志处理1.1 实时日志分析1.1.1 nginx日志配置1.1.2 nginx日志示例1.1.3 日志分析示例 1.2 多文件合并分析1.3 时间范围日志提取 2 问题追查2.1 进程级问题定位2.2 网络连接排查2.3 硬件故障追踪 3 数据统计3.1 磁盘空间预警3.2 进程资源消耗排名3.3 HTTP状态码统计…