关于go:golang中地图的大O性能是什么?

What is the Big O performance of maps in golang?

"图类型"部分的describes去语言规范的接口和通用图usage of类型和"去地图行动"的博客帖子去casually mentions哈希表和"快速查找adds deletes鸭"。

runtime/hashmap.go电流源代码describes ITS的实施作为一个哈希表(这是typically amortized O(1));然而,在没有看到任何保证的性能特性(如大O性能)的语言规范或其他材料。

不去做任何的语言包的性能(如恒小时查找/插入/缺失?)图为只读类或接口的包吗?(compare的Java语言在接口和实现等是明确分开的。)


语言引用不能明确保证映射的性能。有一种隐含的期望,即映射的执行方式与哈希表的执行方式相同。我不明白性能保证如何避免被含糊不清地指定或不准确。

大O复杂度是描述映射运行时间的糟糕方法:实际上,实际的时钟时间是相关的,而复杂度则不是。理论上,具有有限域(如ints)的键的映射在空间和时间上都是微不足道的O(1),具有无限域(如字符串)的键的映射需要散列和相等的细节。要包含在成本中的测试,这使得插入和查找的最佳情况平均为O(n log n)(因为键的大小平均必须至少为O(log n),才能用n个条目构造哈希表。除非您在规范中得到了正确的这些细节,否则它将是不准确的,而且获得正确的好处显然不值得。

要保证实际的运行时间而不是复杂性,这也很困难:目标机器的范围很广,缓存和垃圾收集的问题也很复杂。


据我所见,Go编程语言规范并不能保证映射类型的性能。哈希表通常是用于插入、查找和删除数据的O(1);我们可以假定对于go的映射也是这样。

如果您担心映射性能,您可以随时在不同的负载上对代码进行基准测试,并决定是否使用Go的映射或其他数据结构。


精确地说,哈希表的性能是O(1+N/K),用于解决冲突,其中N/K指的是负载系数。go-spec声明映射在键数量上是非限制的。因此,它们需要动态调整大小,并进行部分重洗,以在增长或收缩时保持负载系数。这意味着近O(1)可以很容易地实现在恒定大小的地图中查找,但理论上甚至不能保证大规模插入或删除。这样的操作需要重新分配、部分重设和可能的垃圾收集,以保持负载系数和合理的内存使用。