大O操作次数

时间:2011-01-20 21:18:45

标签: big-o pseudocode operations

如何计算每行代码所需的操作数。

实施例

Algorithm find2D (A,x)
    arrLength = A.length
    for j <- 1 to arrLength – 1 do
         for k <- 1 to arrLength – 1 do
                if A[j][k] = x then
                  return true
          increment k
    increment j
return false

我想出了这个伪代码。所以我不确定如何计算每行代码所需的操作数。

因此,第一个循环将是1 + n个操作,因为你必须设置j,将j与arrLength - 1进行比较,它将循环n-1次。所以这给你n-1 + 1 + 1,这是n + 1次操作。

所以对于第二个循环,即使它是嵌套的,它也是一样的。

我对A[j][k] = x比较感到有点困惑,那将是多少次操作。

感谢。

3 个答案:

答案 0 :(得分:2)

一般的经验法则是:

每次循环遍历数组中的每个元素时,乘以N

每次重复将数组分成两部分时,乘以log(N)

由于整个数组上有两个嵌套循环,因此你是O(N ^ 2)。

计算常数因子比较棘手,并且取决于语言,编译器和硬件的细节。基本上只需要凭经验来解决这个问题。

答案 1 :(得分:1)

Big-Oh是渐近的,所以你不应该关注“1 + n”中的“1”。

如果您要查找的只是该代码的Big-Oh分类,只需考虑您有两个循环,一个嵌套在另一个循环中,每个循环对每个元素执行一些常量操作。然后内部循环为O(n),外部循环执行内部循环n次,因此外部循环为O(n ^ 2)。然后整个函数是O(c + n ^ 2),其中c是来自外部循环周围的代码的恒定操作数。由于Big-Oh是渐近的,c消失了,你的函数是O(n ^ 2)。

如果您正在尝试计算代码执行的确切操作数,则可能需要确定您正在使用的abstract machine

希望这有帮助。

答案 2 :(得分:0)

就大O而言,你应该选择你要计算的操作,最频繁和最原子的操作。在这种情况下,它是两个循环内的比较。您不需要计算循环进行迭代的次数,您只需计算最坏情况下最内部执行的次数。对于外循环,n-1为内循环,n-1为内循环,总共O(n^2)