簡體   English   中英

O(|V| * k) 是否等於 O(|E|)?

[英]Is O(|V| * k) equal to O(|E|)?

我假設在表示鄰接列表時,我們需要遍歷所有頂點及其鄰居,因此構建鄰接列表的時間復雜度為 O(|V| * k) 其中 V 是頂點的集合,k 是數量某個頂點具有的鄰居數(k = |V| - 如果圖是完整的,則為 1)。 但是,我遇到的每個資源都表明構建鄰接列表的時間復雜度是 O(|E|),其中 E 是邊的集合。

由於我們正在考慮最壞情況,因此圖的最壞情況是連通圖,其中 |E| 等於 (|V| 2) = (|V| * (|V|-1))/2。 如上所述,從完整圖構建鄰接列表需要遍歷所有頂點及其鄰居。 該操作的時間復雜度為 |V| * k 其中 k 是 |V|-1。 所以,它應該是 O(|V| * (|V|-1)) => O(|V|^2)。 既然我們發現邊數是(V * (V-1)) / 2 => O(|V|^2),那么兩個復雜度O(|V| * k)和O(|E| ) 應該是一樣的。

讓我困惑的是為什么人們更喜歡使用 O(|E|) 而不是 O(|V| * k)?

O(|V| * k) 是否等於 O(|E|)?

是的。

其中 V 是頂點集,k 是某個頂點具有的鄰居數

這個定義是不正確的,因為k取決於“某個頂點” `,因此您需要將其定義為最大度數(頂點具有的最大邊數)才能獲得可用的定義。


關於max-degreeO(maxdeg * |V|)不等於O(|E|) 最大度數是比|E|更差的復雜度近似值。 .

想象一下一個圖,它有一個頂點,它有1_000邊,但每個其他頂點只有1條邊。

但是由於 Big-O 只定義了上限,所以算法當然仍然在O(maxdeg * |V|)中。


在任何情況下,您最多只能在圖中的每條邊上查看一次,所以|E| . 邊的數量是所有頂點的所有出邊的總和,即你試圖用|V| * k公式化的東西 |V| * k 所以兩者是完全一樣的。 IE

|E| = sum (v * outdegree(v))

(在這種情況下k不是最大度數,而是每個v特定的出度數)

讓我困惑的是為什么人們更喜歡使用 O(|E|) 而不是 O(|V| * k)?

通常,將圖視為具有頂點和邊的實體更為常見,操作取決於VE 只說O(|E|)比從“頂點及其傳出邊”角度來看事情過於復雜要簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM