繁体   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