【问题标题】:Big O notation of an algorithm with a matrix as an input以矩阵为输入的算法的大 O 表示法
【发布时间】:2014-09-09 00:42:08
【问题描述】:

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

在数学中,可以将 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)?不同维度(即立方体等)是否相同?

附:希望我的解释正确。

【问题讨论】:

    标签: algorithm big-o asymptotic-complexity


    【解决方案1】:

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

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

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

    你被要求找出给定的数字'n'是否是素数。你编写了一个简单的算法来检查从 1 到 n-1 的可分性。现在,您可以争辩说您只进行了 n 次操作,因此它是一个 O(n) 算法。然而,事实上,这个算法是指数的。原因是,这里您的输入不是大小为“n”的,而是由 log n 位表示的单个值。所以,你输入的大小是 log n。现在,您正在执行 n 次操作。因此,您的算法的运算次数和输入大小之间的关系是指数的(因为 n = 2^(log n))。

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

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 2021-05-07
      • 2022-10-04
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多