有很多链接告诉我,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等的原因。
任何人都有一个很好的链接?
答案 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)
(由于c
是n
的函数,因此可能在不同的情况下会有点误导,将其作为常量拉出来;因此是曲线。)