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