【问题标题】:What is the order of growth of this function?这个函数的增长顺序是什么?
【发布时间】:2014-05-21 20:56:56
【问题描述】:

我是算法和大0的新手。这个函数的增长顺序是什么?

我做了一个 println 并且 f(10) 运行了 15 次。 f(20) 运行 31 次。

在我看来它像 log(N)*N/2。所以是logarithmic 还是linearithmic

   static long f (long N) {
        long sum = 0;
        for (long i = 1; i < N; i *= 2)
            for (long j = 0; j < i; j++)
                sum++;
        return sum;
    }

【问题讨论】:

  • 这是作业吗?告诉我们您是如何推理的以及推理的方法是什么,我们会告诉您您解决问题的方式是否正确。

标签: time-complexity big-o


【解决方案1】:

运行时间为 O(n)。要看到这一点,请注意内部循环在第一次迭代中运行 1 次,在下一次迭代中运行 2 次,在下一次迭代中运行 4 次,更一般地,在 2 上运行 2i 次第 i 次迭代。外层循环在 lg n 次迭代后停止,因为它不断加倍,所以完成的总工作量为

1 + 2 + 4 + 8 + ... + 2lg n

这是sum of a geometric series,计算结果为 2lg n + 1 - 1 = 2 · 2lg n - 1 = 2n - 1 = O(n )。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    内循环 j 计数 i 次 -> 最大值为 n

    外循环从0计数到n,每次乘以2,所以是lgn次。

    所以总数是 o(nlgn)

    【讨论】:

    • 这是一个正确的界限,但并不严格。请参阅我的答案以获得更严格的限制。
    • 内循环并不是真正的 O(n) 是吗?它更像是来自外循环的 N of Log(N)?
    • @user3570795 没错。这是计数的上限,因此是 N。
    【解决方案3】:

    正式进行,你得到:

    【讨论】:

      【解决方案4】:

      O(2^lgn) 应该是复杂度。指数函数的增长不仅仅是线性函数。因此 2.2^lgn=O(2^lgn) 而不是 O(n)

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 2021-11-19
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        相关资源
        最近更新 更多