【问题标题】:what is the big O notation for this pseudo-script这个伪脚本的大 O 表示法是什么
【发布时间】:2015-04-24 09:41:30
【问题描述】:

我正在研究大 O 表示法,我想找到我从 Project Euler 解决的数学问题的大 O 表示法。

total

for x (0..9){
    for y (0..9){
        for z(0..9){
            if(some_condition == true){
                total = total + permute(x,y,z)
            }
        }
    } }
print total

由于有 3 个循环,我的猜测是 O(N^3),但我不确定

【问题讨论】:

  • 由于循环直到恒定值,对我来说复杂性似乎是置换函数的复杂性。
  • O(1)。没有变量输入。
  • 应该for x (0...9)for x (0...N)

标签: algorithm big-o complexity-theory computer-science


【解决方案1】:

正如@thang的评论所指出的,算法的复杂度实际上是O(1)

当我们谈论算法的时间复杂度时,重要的一点是:

我们总是考虑算法所需的时间相对于其输入的大小

请注意,虽然我们调用了permute() 函数10 * 10 * 10 = 1000 次(对于x, y, z = 0, 1, ..., 9),但每次调用permute() 的运行时间上限为:

T := max { T(0, 0, 0), T(0, 0, 1), ..., T(0, 0, 9),
           T(0, 1, 0), T(0, 1, 1), ..., T(0, 1, 9),
           ...
           T(9, 9, 0), T(9, 9, 1), ..., T(9, 9, 9) }

即它的上限是 1000 个可能的输入值的最大运行时间。

所以在最坏的情况下,算法的运行时间上限为1000 * T。观察T 实际上是独立 的输入大小(因为你没有任何输入),所以你的算法的运行时间实际上是O(1)

【讨论】:

  • 这个答案比我的好,准确到可以接受。
【解决方案2】:

复杂度是=O(10*10*10*C(permute))=O(1000*C(permute))=O(k*C(permute)),
其中C(permute) 是函数compute(x,y,z) 的复杂度。

【讨论】:

  • 0...9 是 10 次迭代。
  • @thang 改变了它。虽然,这并不重要。
  • 下降了大约 27%!这还不算多?
  • 我的意思是复杂度还是O(k*C(permute))