[英]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.