簡體   English   中英

O(m * n) + O((m + n) * log(m + n)) 的復雜度評估是多少

[英]What is the complexity evaluation of O(m * n) + O((m + n) * log(m + n))

我有以下 Python 代碼,a 和 b 是列表(我知道這不是獲得交集的最佳方式):

def get_intersection(a, b):
    a = set(a)
    b = set(b)
    c = sorted(list(a&b))
    return c

讓我們調用 len(a) - m 和 len(b) - n,其中沒有關於 a 和 b 的附加信息。 那么給定代碼的時間復雜度為 O(m) + O(n) + O(m * n) + O((m + n) * log(m + n))。

我絕對可以縮短 O(m) 和 O(n),因為它們遠小於 O(m * n),但是我應該如何處理 O((m + n) * log(m + n))?

我如何比較 O(m * n) 和 O((m + n) * log(m + n))? 我應該在最終評估中保留 O((m + n) * log(m + n)) 嗎?

您可以將總輸入大小視為n 哪個論點對總數的貢獻並不重要。 (兩個極端是當一個或另一個參數為空時;將項目從一個參數移動到另一個參數不會改變您將要做的工作總量。)

因此, set(a)set(b)都是 O(n) 運算。

a & b也是 O(n); 您不需要將a的每個元素與b每個元素進行比較來計算交集,因為集合是基於哈希的。 您基本上只需進行 O(n) 次恆定時間查找。 (我忽略了使設置查找線性化的可怕的極端情況。如果您的數據具有一個哈希函數,該函數不會將每個項目都映射到相同的值,那么您將不會遇到最壞的情況。)

sorted(a&b) (不需要先創建一個列表,但這也只是一個 O(n) 操作)需要 O(n lg n)。

因為前面的每一個操作都是依次執行的,所以get_intersection的總復雜度是O(n lg n)。

我不認為你可以簡化表達式。

事實上,如果你將m設置為一個常數值,比如5 ,你有一個復雜性

5n + (n+5)log(n+5) = O(n log(n))

並且第一項被吸收。

但是如果你設置m = n

n² + 2n log(2n) = O(n²)

這一次第二項被吸收了。 因此你只能寫

O(mn + (m+n) log(m+n)).

隨着變量的變化, s是總和, p是乘積,

O(p + s log(s)).

暫無
暫無

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

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