一尘不染

戈朗地图的O表现如何?

go

Go语言规范“地图类型”部分描述了地图类型的界面和常规用法,The
Go Blog上
“ Go maps in
action”一文中
偶然提到了哈希表和“快速查找,添加和删除”。

电流runtime/hashmap.go源代码描述了其作为散列表实施方案(其通常摊销O(1));
但是,在语言规范或其他材料中我看不到任何性能特征(例如Big O性能)的保证。

go语言是否为地图类型或仅 接口 保证了任何 性能 保证(例如,恒定时间插入/查找/删除?)?(与 接口实现
明显分开的Java语言相比。) __


阅读 164

收藏
2020-07-02

共1个答案

一尘不染

语言参考并未明确保证地图的性能。映射的执行有一个隐含的期望,就像您期望哈希表执行一样。我看不到性能保证如何避免被模糊地指定或不准确。

Big-
O复杂度是描述地图运行时间的一种糟糕方法:实际上,实际时钟时间是相关的,而复杂度则无关紧要。从理论上讲,具有有限域键(例如ints)的映射在空间和时间上都是O(1),而具有无限域键(例如字符串)的映射需要散列,并且相等性测试的详细信息包括在成本中,这使得插入和查找的平均情况最好为O(N
log N)(因为键的平均大小必须至少为O(log N)才能构造具有N个条目的哈希表。除非您在规范将是不准确的,正确实现它的好处显然不值得。

要保证实际运行时间而不是复杂性,这也很困难:目标计算机种类繁多,还有缓存和垃圾回收的混杂问题。

2020-07-02