为什么迭代HashMap O(c/n)?
有很多的链接,告诉我,大O的一个HashMap是:为什么迭代HashMap O(c/n)?
get O(1)
add O(1)
contains O(1)
next item O(c/n) c = table capacity (number of buckets) n = size
这是还挺显而易见的,为什么得到/添加/包含的O(1),但我想知道为什么迭代是O(c/n)。
虽然我在的话,我很想知道为什么大O的是,他们是什么样的ConcurrentHashMap,TreeMap的等
任何人有一个很好的链接?
链接文件不是说迭代为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
功能它可以有点不同的情况来误导把它拉出来作为一个常数;因此,波形曲线。)
首先,“下一个条目”是什么意思,为什么是“容量”条目。如果你有6个桶和18个入口比c
只是要详细了解“下一个入口” - 但它没有被定购。那么,如果要使用订单,那么是否需要获得下一个元素?我同意迭代是O(N)。只是仍然对“下一个入口”感到困惑? – 2013-03-26 21:10:13
@MoreThanFive“下一项”并不意味着订单。从“第一条目”开始,反复调用“下一条目”将最终到达“最后条目”,同时只返回散列映射中的条目并且不会重复条目。 – 2013-03-26 21:11:12
O(c/n)的源代码是什么?我从来没有见过这样的BigO。迭代(遍历整个集合)总是O(n)。 – zam664 2013-03-26 20:28:22
来源:http://www.coderfriendly.com/wp-content/uploads/2009/05/java_collections_v2.pdf – 2013-03-26 20:31:21
链接的文件*不*说迭代是'O(h/n)'。它说*“下一个条目”*是'O(h/n)'。迭代是每个* n的“下一个条目”*。 – 2013-03-26 20:43:08