簡體   English   中英

O(M + N)的復雜度

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

此示例的時間復雜度與mn的最大值呈線性關系。

對於圖算法,通常會得到O(m+n)復雜度。 這是例如BFS或DFS之類的簡單圖形遍歷的復雜性。 然后n = |V| 代表頂點數, m = |E| 對於邊的數量,其中圖形為G=(V,E)

Knuth-Morris-Pratt字符串搜索算法就是一個示例。

http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm#Efficiency_of_the_KMP_algorithm

您要查找的字符串(針或花樣)的長度為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.

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