【问题标题】:Asymptotic analysis of a given code给定代码的渐近分析
【发布时间】:2018-11-03 03:24:13
【问题描述】:

我得到了以下伪代码:

 j = 1
 while j < n:
      k = 2
      while k < n:
           k = k*k
      j++

在我看来,这段伪代码将具有以下复杂性:

 O(n*log(n))

由于外部循环执行 n 次。而内部循环基本上每次将增量分成一半。我的想法是不是太过分了?

编辑:另外 1 个(我保证,这些不是作业,只是要理解的示例)

 for i = 1 to n:
    for j = 1 to n:
       k = j*j
       while k < n:
          k++

在这种情况下,最外层的循环将执行 n 次。中间循环也将执行 n 次,现在我们将执行 n2 次。据我了解,最里面的循环将执行 log(n) 次,使我们处于 O(n2*log(n)) 次。我的理解正确吗?

【问题讨论】:

  • 你确定你写的伪代码正确吗?我看到这个的方式有一个大小为 n 的外循环和一个大小为 n-1 的内循环,所以这应该是 O(n^2)。我假设 k++ 在内部循环中并且“做某事”是 O(1)。
  • 什么是“做某事”?
  • @Mitchel0022 做某事只是意味着做你在循环中所做的任何事情。编辑删除它
  • @idnavid 我最初写错了。修好了。

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


【解决方案1】:

我是O (n log log n)

就时间而言,外部循环只是重复内部循环n 次,因此它贡献了n 的乘数。

内部循环比较复杂,它会重复对k 求平方。 看看情况如何: 2^1 -&gt; 2^2 -&gt; 2^4 -&gt; 2^8 -&gt; 2^16 -&gt; 2^32 -&gt; ... 因此,例如,如果n = 2^32,则循环将有5 迭代。 这里,log_2 (n)32log_2 (32)5

一般情况下,如果n = 2^(2^r),则内循环将在r 迭代后到达n。 通过取对数,我们得到log n = 2^r。 通过再次取对数,我们有log log n = r。 您可能知道,在处理渐近行为时,对数的底并不重要,只要它是常数即可。

所以,我们有一个循环的n 迭代,它本身进行log log n 迭代,使整体复杂度O (n log log n)

【讨论】:

  • 一开始有点反直觉,但有道理。如何将其重写为 nlogn?步骤是什么?
  • @basil 将 k = k*k 替换为 k = k*2 或任何其他常量 > 1
  • 我又加了一个例子,我的理解正确吗?
  • @basil 如果您有新问题,请将其作为单独的问题发布。
  • @basil 添加的内容完全不同。而且您没有为自己的答案提供任何理由(“最里面的循环,据我了解,它将执行 log(n) 次”)。也许尝试找到这样的推理,如果您没有成功,请将其作为单独的问题发布。无论如何,请从问题中删除添加内容以保持一致。
【解决方案2】:

是的,你是对的,第一个循环是 O(n)。第二部分有点棘手。我打算用理性而不是严谨来展示它的 O(logn)。

所以让我们先假设它是k = k * 2。这是一个熟悉的序列,我们称为O(logn),但是我们看到k &gt;= 2 用于任何给定的循环,所以我们知道序列k = k*k 将在上面以O(logn) 为界,也就是说它在most O(logn)。很容易看出它不是O(1),所以我们知道 O(1) 是一个下限。一起来领取O(nlogn)

【讨论】:

  • 虽然确实有一个上限 O (n log n),但更严格的界限是 O (n log log n),如我的回答所示。
【解决方案3】:
O(n log(n))

k^log(n) 正是 k 等于或大于 n 的值。

log(n) = x 表示 2^x = n

你运行循环 n 次。

所以复杂度是 O(n * log(n))

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2014-10-28
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多