2013-03-26 72 views
0

有很多的鏈接,告訴我,大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的等

任何人有一個很好的鏈接?

+0

O(c/n)的源代碼是什麼?我從來沒有見過這樣的BigO。迭代(遍歷整個集合)總是O(n)。 – zam664 2013-03-26 20:28:22

+0

來源:http://www.coderfriendly.com/wp-content/uploads/2009/05/java_collections_v2.pdf – 2013-03-26 20:31:21

+0

鏈接的文件*不*說迭代是'O(h/n)'。它說*「下一個條目」*是'O(h/n)'。迭代是每個* n的「下一個條目」*。 – 2013-03-26 20:43:08

回答

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功能它可以有點不同的情況來誤導把它拉出來作爲一個常數;因此,波形曲線。)

+0

首先,「下一個條目」是什麼意思,爲什麼是「容量」條目。如果你有6個桶和18個入口比c 2013-03-26 21:02:29

+0

只是要詳細瞭解「下一個入口」 - 但它沒有被定購。那麼,如果要使用訂單,那麼是否需要獲得下一個元素?我同意迭代是O(N)。只是仍然對「下一個入口」感到困惑? – 2013-03-26 21:10:13

+0

@MoreThanFive「下一項」並不意味着訂單。從「第一條目」開始,反覆調用「下一條目」將最終到達「最後條目」,同時只返回散列映射中的條目並且不會重複條目。 – 2013-03-26 21:11:12