谁能告诉我"大哦"这段代码。
for(int i = 0; i < n; i++)
for for(int j = 0; j < n; j++)
statements1.....
for(int k = 0; k< 60; k++)
for(int l = 0; l < 10; i++)
statements2....
end l;
end k;
for(int g = 1; g < n; g *= 10)
for(int h = 1; h < n; h *= 10)
statements 3..........
end h;
end g;
end j;
end i;
我正在研究算法而且我遇到了这个,因为这些循环我不明白如何解决。
答案 0 :(得分:2)
假设statements1
,statements2
和statements3
应被视为常量时间操作。
现在您有以下结构
for [0...n]
for [0...n]
for [0...60]
for [0...10]
for [0...n in exponential steps]
for [0...n in exponential steps]
[0...60]
和[0...10]
部分为O(1)
,因为60
和10
是不变的。具有指数步骤的循环可以简化如下:
for [0...n]
for [0...n]
for [0...log n]
for [0...log n]
所以你最终得到O(n² * (log n)²)
答案 1 :(得分:0)
首先,statements1
以及以下所有内容执行$ n ^ 2 $次。
但是其他循环呢?
每次执行statements1
时,statments2
执行600次,可以用big-O表示法忽略。
statements3
怎么样?好吧,这里发生了奇怪的事情,因为只有i
在statements3
内某处被修改才能完成。如果发生这种情况,那么这个分析的其余部分是错误的,因为statements1
不会像我在开始时那样经常执行。
但是,如果您打算写下以下内容:
for(int g = 1; g < n; g *= 10)
for(int h = 1; h < n; h *= 10)
然后每个循环都添加log(n)
因子,得到总O(n ^ 2 * log ^ 2(n))
总而言之:只有这个代码才能分辨出来。