【问题标题】:Is this code O(n) or O(logn)?这个代码是 O(n) 还是 O(logn)?
【发布时间】:2014-03-19 15:22:44
【问题描述】:

它只检查了 1/3n 次 for 循环,所以我猜它在技术上仍然是线性的?但是我真的不明白为什么它不是 O(logn),因为很多时候运行时间为 O(logn) 的代码最终会检查大约 1/3n。 O(logn) 每次总是将选项除以 2 吗?

int a = 0;
for (int i = 0; i < n; i = i+3)
    a = a+i;

【问题讨论】:

  • 当你加倍n时,你的循环运行的次数是否加倍?还是添加一个常数?
  • 你的例子是 O(n);因为它是线性的。考虑像 binary search 这样的对数算法。
  • 这是有道理的霍布斯。谢谢你说清楚
  • 小挑剔,但i = i + 3 后面的; 是语法错误。
  • 我的错,不是故意写的

标签: java big-o


【解决方案1】:

您的代码复杂度为 O(n),O(n)/3 == a * O(n) == O(n)

【讨论】:

    【解决方案2】:

    对于时间复杂度分析,常数因素无关紧要。您可以在每个循环中执行 1,000,000 次操作,它仍然是 O(n)。因为常数 1/3 无关紧要,它仍然是 O(n)。如果您的 n 为 1,000,000,则 n 的 1/3 将比 log n 大得多。

    来自Wikipedia entry on Big-O notation

    设 k 为常数。那么:

    O(kg) = O(g) if k is nonzero.
    

    【讨论】:

    • rgettman,我有一个问题。如果在 for 循环中,n = n-2; 跟在 a = a+i; 后面怎么办?在这种情况下,什么是 Big-O?
    • @user3251142 仍然是 O(n)。迭代次数约为n/5 而不是n/3(使用n 的原始值)。我假设您将添加花括号,以便 n=n-2 成为循环的一部分。
    • 问问自己for循环中的迭代次数是否仍与n的原始值成正比。
    • 嗯,它会是 (n-2*c)/3 什么的……对吧?如果你加倍 n,运行时间不会以同样的方式加倍......会是这样吗?
    • @user3251142 所有2*c/3 的东西都是带有常量的操作。它仍然是 O(n)。制作这样一个循环 O(log n) 的方法是在每个循环中将n 除以一个常数,或者在每个循环中将i 乘以一个常数。
    【解决方案3】:

    它是 n 的顺序 O(n) 而不是 O(logn)。 这是因为运行时间随着n的增加而线性增加

    有关更多信息,请查看此图表,希望您能理解为什么它没有登录 https://www.cs.auckland.ac.nz/software/AlgAnim/fig/log_graph.gif

    【讨论】:

      【解决方案4】:

      运行时间为O(n)(以单位复杂度衡量)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 2012-11-22
        • 1970-01-01
        相关资源
        最近更新 更多