为什么迭代哈希映射O(c / n)?

时间:2013-03-26 20:16:46

标签: performance hashmap

有很多链接告诉我,hashmap的Big O是:

get   O(1)
add   O(1)
contains O(1)
next item O(c / n)    c = table capacity (number of buckets) n = size

有趣的是,为什么get / add / contains是O(1),但我想知道为什么迭代是O(c / n)。

当我在这里时,我很想知道为什么Big O是它们对于ConcurrentHashmap,TreeMap等的原因。

任何人都有一个很好的链接?

1 个答案:

答案 0 :(得分:2)

链接的论文 表示迭代是O(c/n)。它说“下一个条目”是O(c/n)。迭代是每个n的“下一个条目”。

首先,请注意c (capacity) > n (entries)是一个不变量 - 而c是n的某个函数 - 所以O(c/n)> O(1/n)。 (注意:根据评论,我不完全确定我对HashMap实现中的不变量的断言,该实现使用链接进行冲突解决。)

所以这有效地说明了在标准的HashMap中,在执行“下一个条目”时查看的一些桶是为空并且必须被跳过。因此,对于“下一个条目”,界限是“超过”O(1/n)。但是,在阅读此边界时要小心,因为意味着迭代速度越快n - 它只是用总n来描述“下一个条目”界限条目。

由于迭代实际上只是所有n的“下一个条目”,因此对于HashMap的迭代:

O(1/n * n) -> O(n)
O(c/n * n) -> c*O(n) -> ~O(n)

(由于cn的函数,因此可能在不同的情况下会有点误导,将其作为常量拉出来;因此是曲线。)