"大哦"块语句

时间:2014-12-02 12:43:08

标签: algorithm big-o

谁能告诉我"大哦"这段代码。

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;

我正在研究算法而且我遇到了这个,因为这些循环我不明白如何解决。

2 个答案:

答案 0 :(得分:2)

假设statements1statements2statements3应被视为常量时间操作。

现在您有以下结构

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),因为6010是不变的。具有指数步骤的循环可以简化如下:

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怎么样?好吧,这里发生了奇怪的事情,因为只有istatements3内某处被修改才能完成。如果发生这种情况,那么这个分析的其余部分是错误的,因为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))

总而言之:只有这个代码才能分辨出来。