我已将下面算法的复杂度计算为
for i = 0 to m
for j = 0 to n
//Process of O(1)
复杂性:O( m * n)
这是O(m * n)的简单例子。但我无法弄清楚O(m + n)是如何计算的。任何示例示例
答案 0 :(得分:1)
O(m + n)表示O(max(m,n))。代码示例:
for i = 0 to max(m,n)
//Process
此示例的时间复杂度与m
和n
的最大值呈线性关系。
答案 1 :(得分:1)
图形算法经常会出现O(m+n)
复杂度。例如,简单的图遍历(例如BFS或DFS)就是复杂的。然后n = |V|
代表顶点数量,m = |E|
代表边数,其中图表为G=(V,E)
。
答案 2 :(得分:1)
Knuth-Morris-Pratt字符串搜索算法就是一个例子。
您要查找的字符串(针或图案)的长度为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循环来计算复杂度都没关系。
希望这有帮助。