当前位置: 首页 > 网络应用技术

golang |从浅层到深刻理解哈希桌图

时间:2023-03-05 23:03:37 网络应用技术

  哈希表也被称为最常见的数据结构之一。它可以提供1 -至-1映射。它的读写表现非常出色

  本文首先需要从哈希表开始,分析影响哈希表面性能的因素,并介绍共同的哈希功能和解决哈希冲突的方法。然后从GO中的源代码分析中,如何哈希表设计并在侧面进行优化

  本文基于分析

  哈希表是随机存储的优化。实现了底层。当使用它时,首先对其进行分类。在阅读和写作时,您可以直接在相应的内存区域读取和写作,以避免过多的计算。可以实现O(1)时间的时间复杂性。

  哈希表的底层基于实现。关键是计算。这里需要一个。哈希功能的选择可以很大程度上确定哈希表的读写性能

  当由不同的键计算出的哈希值时,就会发生哈希冲突。发生哈希冲突时,哈希表的读取和写作性能通常会下降到甚至级别。

  因此,我们可以总结一些影响哈希表面性能的因素:

  关键字或关键字的某个线性函数值是分布地址。

  将关键字乘以一个不大于散点列表的长度m的数字P,并作为分布地址获取。

  当关键字的数量大于地址数时,分析了关键字的分布,并且任何分布式分布都均匀分布作为分布地址。

  当所有关键字都知道时,确定它是根据实际应用程序选择的,以尽可能避免冲突。

  选择一个随机函数并使用关键字的随机函数值作为其哈希值。通常,当关键字的长度不等时,通常使用此方法。

  分布较均匀的哈希功能,更接近o(1)性能性能的读写和写作操作

  该方法的核心思想是检测和比较数组中的元素,以确定目标键值是否存在于哈希表中。如果我们使用打开的地址方法来实现哈希表,则哈希大塔结构底部的数据是一个数组。

  实现拉链方法通常使用数组和链接列表,但是在拉链方法的哈希(Hash)中引入了最佳性能。它的实现稍复杂,但平均搜索长度相对较短。动态应用了用于存储节点的每个内存,这可以节省更多的存储空间

  也就是说,当哈希冲突发生时,将处理钥匙,并将再次计算钥匙的海滩价值

  地图的初始化分为两种类型

  首先是初始化并返回指针

  第二个是初始化字面数量

  nil可以用作关键,以后的定义的定义将放置先前定义的覆盖范围

  使用距离遍历图

  需要注意

  地图的密钥类型不能。因为他们不能做出同等的判断。

  如果键是接口{},请在运行时使用func()作为键,并且会抛出运行时。

  我们可以找到一个有趣的观点。在Golang中,它们都是指指针的形式,他们不能做到。但是,指针形式可以用作地图的关键吗?

  它主要在操作过程中用来表示,让我们看一下其结构

  让我们看一下溢流桶的数据结构

  看结构

  我们可以获取地图的一般数据结构

  当初始化以字面数量初始化时,它最终将要求初始化。

  当将哈希分配给堆栈并且其容量小于容量时,以下方式用于快速在编译阶段初始化哈希。

  其他情况调用该方法。实际上,无论哪种方法用于初始化地图,都将在最后调用

  方法主要做这四件事

  根据-in -in -law中计算出的计算出的存储桶数将在内存中分配以存储数据:

  阅读主要包括2个接口。第二个接口可以知道与第一个接口相比,地图中是否存在目标。考虑到零值,建议使用第二个接口。LET的分析:

  在周期中,正常枪管中的数据和桶中溢出的数据在周期中遍历。它将首先比较存储在枪管中的海滩,然后比较枪管中传递到枪管中的值。

  正确的分配操作主要在功能中

  注意

  在两种情况下都会发生扩展

  扩展通常分为两个步骤

  创建一个新的枪管

  创建新枪管时,请使用新桶的创建并创建溢出的溢出,然后设置原始的枪管阵列,然后将新的空桶设置为

  数据迁移

  如果将其加倍,则将旧桶中的数据转移到两个新桶中,因此它将创建两个结构来保存和分发上下文。这两个结构指向一个新的枪管:

  总体扩展是一个增量扩展,可以避免由于扩展而引起的瞬时内存抖动

  地图的遍历是

  地图的遍历也分为两个步骤

  可以看出,该方法将生成一个随机数。根据随机数,选择一个枪管位置作为遍历的起点

  为什么迭代时应该随机化

  作为我们最常用的数据结构之一,有必要考虑最佳性能。

  原始:https://juejin.cn/post/7100271910344196127