以下计划的复杂程度如何:
void function(int n)
{
int i, j, k , count =0;
for(i=n/2; i<=n; i++)
for(j=1; j=j + n/2<=n; j++)
for(k=1; k<=n; k= k * 2)
count++;
}
根据我的理解,外循环执行n / 2次。内循环执行n / 2次,第三内循环执行log n次。现在,如果我们将算法的时间复杂度表示为函数T(n)。
T(n)= n / 2 * n / 2 * log n = n ^ 2/4 * log n
现在,对于非常大的n项输入大小,与术语n ^ 2相比,log n变得太小。因此,根据我的理解,算法的时间复杂度必须为O(n ^ 2)。但我已经检查了上述程序的答案,它说答案是O(n ^ 2logn)。
任何人都可以帮助我理解为什么我们不能忽略n的较大值的log n一词?或者我的计算错了吗?
答案 0 :(得分:3)
您只能忽略常量值。如果n增加,log(n)也会增加。
答案 1 :(得分:0)
如果我们假设你的algorihtm有运行时功能(不完全正确):
T(n)=n/2*n/2*log n =n^2/4*log n= an^2*log(n)
你可以做正式的渐近分析:
我们可以很容易地证明我们可以找到c1和c2来实现:
所以最后你可以说你的算法有复杂性: