O(M + N)的复杂性

时间:2014-03-12 21:46:58

标签: algorithm big-o complexity-theory

我已将下面算法的复杂度计算为

for i = 0 to m
    for j = 0 to n
        //Process of O(1)

复杂性:O( m * n)

这是O(m * n)的简单例子。但我无法弄清楚O(m + n)是如何计算的。任何示例示例

5 个答案:

答案 0 :(得分:1)

O(m + n)表示O(max(m,n))。代码示例:

for i = 0 to max(m,n)
    //Process

此示例的时间复杂度与mn的最大值呈线性关系。

答案 1 :(得分:1)

图形算法经常会出现O(m+n)复杂度。例如,简单的图遍历(例如BFS或DFS)就是复杂的。然后n = |V|代表顶点数量,m = |E|代表边数,其中图表为G=(V,E)

答案 2 :(得分:1)

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)

答案 3 :(得分:1)

for i=0 to m
 //process of O(1)
for i=0 to n
 //process of O(1)

该程序的时间复杂度为O(m + n)。

答案 4 :(得分:0)

上面的示例是一个嵌套的for循环,当你有嵌套循环并且有两个不同的输入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(被认为是非常大的尺寸)时,复杂性被认为是加性的。 对于First循环,您编写复杂度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循环,无论是一段时间还是for循环来计算复杂度都没关系。

希望这有帮助。