簡體   English   中英

了解O(max(m,n))的時間復雜度

[英]Understanding Time complexity of O(max(m,n))

某些機構能否給出一個簡單的程序或算法,其時間復雜度為O(max(m,n))。 我試圖了解漸近符號。 我遵循了一些教程,並了解了它們解釋的內容,即O(n)和O(n ^ 2)。

但是現在我想了解O(max(m,n))的時間復雜度及其計算方式。 請提供一個示例程序或算法來證明這一點。

首次學習大O表示法時要證明的一個普遍定理是:

Θ(max {m,n})=Θ(m + n)

換句話說,任何運行時間為O(max {m,n})的算法也都具有運行時間O(m + n),因此具有這種時間復雜度的任何算法都可以滿足要求。

作為特定示例,請考慮Knuth-Morris-Pratt字符串匹配算法 ,該算法接受兩個字符串並返回第一個字符串是否為第二個字符串的子字符串。 運行時間為Θ(m + n)=Θ(max {m,n}),這意味着運行時間在兩個字符串中較長者的長度上是線性的。

如果無法給出直觀上具有運行時max {m,n}的內容,我深表歉意,但是從數學上講,這確實可以解決。

希望這可以幫助!

我能想到的是Python的izip_longest函數

創建一個迭代器,以聚合每個可迭代對象中的元素。 如果可迭代項的長度不均勻,則將缺失值填充為fillvalue。 迭代一直持續到最長的可迭代耗盡為止。

例如:

In [1]: from itertools import zip_longest

In [2]: list(zip_longest([1, 2, 3, 4, 5, 6, 7], ['a', 'b', 'c']))
Out[2]: [(1, 'a'), (2, 'b'), (3, 'c'), (4, None), (5, None), (6, None), (7, None)]

In [3]: list(zip_longest([1, 2], ['a', 'b', 'c']))
Out[3]: [(1, 'a'), (2, 'b'), (None, 'c')]

In [4]: list(zip_longest([1, 2, 3], ['a', 'b', 'c']))
Out[4]: [(1, 'a'), (2, 'b'), (3, 'c')]

據我所知,為什么這是O(max(m, n))運算而不是O(m + n)運算? 因為當m > n ,增加n不會增加所需的時間。

最簡單的例子是

for i=0 to max(m,n)
     print 'a'

從理論上講: O(max(m,n))只是O(m+n)

O(max(m,n))的“現實生活”示例可能是一種算法,該算法分別針對大小為mn兩個未排序的數組-找到兩個數組中最大的元素

我認為對您問題的最佳答案是羅伯特·哈維(Robert Harvey)的評論。 我認為,使用這種類型的邊界的算法的一個很好的例子是DFS

我希望這將清除您的疑慮:

DFS檢查圖形的每個頂點和每個邊緣。 n表示圖中的頂點數, m表示圖中的邊數。

基於上面的觀察,您可以得出DFS的時間復雜度的上限為O(max(n, m))

請注意,有些圖不能僅通過O(n)約束DFS的時間復雜度。 一個完整的圖就是一個例子。

此外,有些圖不能僅通過O(m)約束DFS的時間復雜度。 空圖就是一個例子。

暫無
暫無

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

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