以矩阵作为输入的算法的大O表示法

时间:2014-09-09 00:42:09

标签: algorithm big-o asymptotic-complexity

多年来,在使用算法之后,我遇到了一个关于算法的渐近行为的问题。

在数学中,人们可以将Big-W(hatever)定义为“根据输入大小'n'测量的f(n)的渐近行为。”我想到的Big-O的定义是(释义):

In order for f(n) to be O(g(n)) we need to find a constant that multiplied by g(n) the expression 'f(n) < c*g(n)' from an initial input (i.e. n0) and forever.

正如我们所看到的,一切都是根据'n'(输入)来衡量的。

我的问题是,如果算法的输入大小是一个矩阵(本身已经是平方),是否意味着如果我使用两个嵌套的'for'循环遍历它,该算法仍然表现为O( n)算法?。

示例:

1 1 1 1 0 1
2 2 0 2 1 0
3 3 1 3 2 1
0 4 2 4 3 2
1 5 3 5 4 0
2 6 0 6 5 1

for(var row=0; row<matrix.rows; row++){
    ...
    for(var col=0; col<matrix.columns; col++){
        ...
    }
}

我的逻辑告诉我这是一个O(n ^ 2),但数学是非常具体的,行为是根据输入大小来衡量的。所以如果这是O(n ^ 2)就好了。但让我感到困惑的是,如果我们从不同的角度来看这个问题,它会让我感到困惑:如果我只是遍历行,现在看起来算法的输入是cols * rows(矩阵)和因为我只遍历行,所以可以说它表现为O(log(n))。

有人可以解释一下这样的工作吗?它是O(n)还是O(n ^ 2)?对于不同尺寸(即立方体等)是否相同?

P.S。我希望我能正确解释自己。

1 个答案:

答案 0 :(得分:0)

我不是真正的专家,但据我所知,这是一个O(n)算法,如果这是你的输入。

您的输入中只有n ^ 2个元素,并且您只处理每个元素一次。

在决定输入大小时应该小心,以找出算法的复杂性。我会给你一个更微妙的例子。

要求您查明给定号码是否&#39; n&#39;是否是素数。你编写一个天真的算法来检查从1到n-1的可分性。现在,您可以争辩说您只进行了n次操作,因此它是一种O(n)算法。但实际上,这种算法是指数级的。原因是,这里输入的大小不是&#39; n&#39;,而是由log n位表示的单个值。所以,你输入的大小是log n。现在,您正在执行n次操作。因此,算法的操作数和输入大小之间的关系是指数的(因为n = 2 ^(log n))。

这里的区别思想是你的意思是一个操作(因为你想要计算每个输入值的操作数)。您总是可以争辩说您输入的只是一个矩阵,您希望将其视为单个元素,因此您的算法是O(1)。然而,这种情况并非如此。复杂性上下文中操作的定义表明,每次在输入单元上执行操作时,它应该在恒定时间内发生。但是,您不能声称矩阵操作是在恒定时间内发生的,因为您所谓的一个元素(矩阵)具有可变大小,并且乘法可以在很大程度上变化而没有边界。将此与整数乘法相比较,计算机具有用于乘法的专用硬件,并且在整数乘法所需的时间上限上有保证(达到一定的容差),这不是整数值的函数。