java - 给定代码片段的大 O 表示法

标签 java time-complexity big-o

我正在寻找有关大 O 表示法的帮助。目标是给出给定代码片段的增长顺序。

int sum = 0
for (int k = n; k > 0; k/=2 )
  for (int i = 0; i < k; i++)
    sum++;

对于这个代码片段,我得到了 (N logN)。第一个 for 循环是 logN,第二个 for 循环是 N。

int sum = 0
for (int i = 1; i < n; i *= 2 )
  for (int j = 0; j < i; j++)
    sum++;

我在这方面遇到了一些麻烦。第一个 for 循环是 logN,但是第二个 for 循环是我陷入困境的地方。第二个 for 循环依赖于第一个 for 循环。我不知道如何用大 N 表示法来表示。

int sum = 0
for (int i = 1; i < n; i *= 2 )
  for (int j = 0; j < n; j++)
    sum++;

第一个 for 循环是 logN。第二个 for 循环是 N。所以这是 (N)?

我正在努力解决这个问题,希望得到一些帮助。谢谢

最佳答案

  1. 您对第一个代码片段的判断是正确的:O(n*log n)。

  2. 在第二个代码片段中,j 循环到 i,最高可达 n - 1,因此j for 循环本身的复杂度为 O(n)。但让我们看看会发生什么。

    • n = 16
    • i = 1 内循环运行 1 次。
    • i = 2 内循环运行 2 次。
    • i = 4 内循环运行 4 次。
    • i = 8 内循环运行 8 次。

    • n = 17

    • i = 1 内循环运行 1 次。
    • i = 2 内循环运行 2 次。
    • i = 4 内循环运行 4 次。
    • i = 8 内循环运行 8 次。
    • i = 16 内循环运行 16 次。

循环次数为

1 + 2 + 4 + ... + 2^x = 2^(x+1) - 1

其中 x 是 n 之前的 2 的幂。这个 2^(x+1) 可能高达 2n,因此整体复杂度为 O(n),去掉常数“2”。

  • 第三个代码片段与第二个代码片段类似;只是 j 每次都会一直到 n。这里的复杂度是O(n*log n)。
  • 关于java - 给定代码片段的大 O 表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180870/

    相关文章:

    java - get-put原理的解释

    java同步和异常处理

    java - getJSONObject 和 getJSONArray 方法的复杂性是什么?

    c# - 我认为这个片段是 O(n^3) 是对的吗?

    java - 设置客户端 SASL 身份验证以连接两个不同的 kafka 集群

    Java gson 通用数组/列表反序列化

    大 O 分析算法

    集合的 Javascript ES6 计算/时间复杂度

    java - Collection.retainAll(Collection) 的成本是多少

    algorithm - Prim的算法时间复杂度如何,ElogV使用Priority Q?