[英]Complexity of O(M+N)
我已經計算出以下算法的復雜度為
for i = 0 to m
for j = 0 to n
//Process of O(1)
復雜度: O( m * n)
這是O(m * n)的簡單示例。 但是我不知道O(m + n)是如何計算的。 任何示例
O(m + n)表示O(max(m,n))。 一個代碼示例:
for i = 0 to max(m,n)
//Process
此示例的時間復雜度與m
和n
的最大值呈線性關系。
對於圖算法,通常會得到O(m+n)
復雜度。 這是例如BFS或DFS之類的簡單圖形遍歷的復雜性。 然后n = |V|
代表頂點數, m = |E|
對於邊的數量,其中圖形為G=(V,E)
。
Knuth-Morris-Pratt字符串搜索算法就是一個示例。
您要查找的字符串(針或花樣)的長度為m
,而要搜索的文本的長度為n
。 對模式O(m)
進行了預處理,然后使用預處理后的數據進行搜索,結果為O(n)
,得出O(m + n)
。
for i=0 to m
//process of O(1)
for i=0 to n
//process of O(1)
該過程的時間復雜度為O(m + n)。
上面的示例是嵌套的for循環,當您具有嵌套循環並具有2個不同的輸入m和n(被認為非常大)時。 據說復雜度是乘法的。 因此,對於第一個for循環,您可以編寫復雜度O(m);對於第一個for循環,您可以編寫O(n);由於它們是嵌套循環,因此可以寫為O(m)* O(n)或O(m * n) 。
static void AddtiviteComplexity(int[] arr1,int[] arr2)
{
int i = 0;
int j = 0;
while (i < arr1.Length)
{
Console.WriteLine(arr1[i]);
while (j < arr2.Length)
{
Console.WriteLine(arr2[j]);
j++;
}
i++;
}
}
類似地,當有2個循環並且它們沒有嵌套並且有2個不同的輸入m和n(被認為是非常大的)時,復雜度被認為是累加的。 對於第一個循環,您編寫復雜度O(m);對於第二個循環,您編寫復雜度O(n);由於存在單獨的循環,您可以將復雜度寫為O(m)+ O(n)或O (m + n)。
static void AddtiviteComplexity(int[] arr1,int[] arr2)
{
int i = 0;
int j = 0;
while(i< arr1.Length)
{
Console.WriteLine(arr1[i]);
i++;
}
while (j < arr2.Length)
{
Console.WriteLine(arr2[j]);
j++;
}
}
注意:以上代碼例如以int數組為例。 另外我使用了while循環,它是一個while循環還是一個for循環來計算復雜度都沒有關系。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.