【问题标题】:Need explanation of time complexity solution of algorithm算法时间复杂度解法需要说明
【发布时间】:2016-10-04 00:02:13
【问题描述】:

我对软件工程课程的介绍刚刚达到了时间复杂度,并学习了如何分析某些算法。我很难理解他们是如何找到解决方案的,希望有人能解释一下,希望有一些合乎逻辑的证据?

void foo(int N) {
    int k = 1;
    while (k < N * N) {
        k = k * 2;
    }
}

他们的解决方案是这个函数的Big-O是O(logN) [我知道这里的log是base 2]

我试图通过将随机值分配给 N 来迭代多少次来解决这个问题,但我找不到模式,有什么帮助吗?

【问题讨论】:

  • 用二进制写出kN的值。那么这一切都应该有意义
  • 使用数学程序/库绘制循环数与 N 值递增的关系。
  • @user6918211:如果您觉得以下答案之一就足够了,请将其标记为答案。

标签: c algorithm time-complexity big-o


【解决方案1】:

k 每次都增加了2 的因子,这就是算法logN 的原因。实际上是log(N^2),但是利用对数的性质,我们可以将其简化为2log(N),然后在N 接近无穷大时将2 去掉,得到log(N)

因此,时间复杂度为O(logN)

编辑:此外,可以看出k1 开始,当k 大于或等于N * N 时程序结束。如果我们采用log(N^2),我们将知道程序将运行多少次迭代。这样做,我们还可以通过取log(N^2) 的上限来确定k 的结束值。

编辑:一个例子是N = 10N 的平方是100。因此,k 将增加直到大于等于100 的两个幂,即128

【讨论】:

    【解决方案2】:

    使用你的高中代数。在p 迭代之后,k 的值是2^p。 (这很容易检查。)当k &gt;= N^2 时,循环将停止执行。代入,循环停止时

    2^p >= N^2
    

    现在解决:

    log_2(2^p) >= log(N^2)
    p >= 2 log(N)
    

    因此循环将在非常接近2 log(N) 迭代时停止。这是 O(log(N))。

    您可以通过指出只有在操作数的大小有固定限制的情况下乘法才是常数时间来让您的老师完成任务。没有这样的限制,问题也取决于乘法的渐近行为。

    顺便说一句,O(log N) 对于所有对数的底都是相同的。基数只通过一个常数因子改变对数的值,而 big-O 忽略了常数因子。

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      相关资源
      最近更新 更多