【问题标题】:How to calculate the complexity of algorithm?如何计算算法的复杂度?
【发布时间】:2014-09-12 21:35:04
【问题描述】:

我目前正在学习算法课程,我需要帮助来解决这个问题。如上所示,因为我持怀疑态度,不太确定。 :) 我有两个问题:

问题 1: 根据我从算法书中的理解,我相信这个问题的运行时复杂度是 f(n) = 3n。为什么?好吧,因为 while 循环将继续运行 n 次,并且对于循环的每次迭代,您都有 3 次操作(1 次减法、1 次乘法和 1 次加法)我的虽然过程是正确的还是错误的?由于赋值语句,它真的应该是 f(n) = 5n 吗?我知道两者的复杂性相同,但我真的很想明确确认。

问题 2: 至于显示算法是否找到多项式的值,足以让我举一个例子来说明它找到特定多项式的值,比如 3n^2 + 2n + 1 来证明算法有效或者是否有更好的这样做的方法。

【问题讨论】:

  • 在计算时间复杂度时不必关心常量。 O(n) 与 O(2n) 和 O(200n) 相同
  • 哦,好的。复杂性 BigOh(n) 上面的代码也是如此。我的思维过程是正确的,还是复杂性是别的? arunmoezhi
  • 你应该问自己这些问题。 while 循环运行多少次? i 的值是否独立于循环内完成的工作(i=i-1 除外)?
  • 哦,看起来 a_i 依赖于 i。
  • 是的。但是 a_i 不会影响 while 循环的执行次数。因此可以安全地假设 while 循环将运行 n 次给你 O(n)。您不必费心计算加法和乘法的次数。这只会改变常量。

标签: algorithm time-complexity


【解决方案1】:

对于第一个问题,复杂度确实是O(n)。

如果您想像您要求的那样更精确地确定,在每个循环期间,您的算法将需要一定量的操作(我的复杂性课程有点老了,我希望我不会错过任何;) ):

  1. 分析循环条件:i>=0
  2. 计算 x 和 y 的乘积
  3. 将结果添加到 a[i]
  4. 将结果存储在 y 中
  5. 计算 i - 1
  6. 将结果存储在 i 中

您的程序还将执行 3 项额外操作:

  1. y = 0
  2. i = n
  3. 上次比较i和0,不进入循环

您还可以考虑计算机必须为 y 和 i 等分配内存的事实。

对于第二个问题,就像在数学中一样,证明它在一种情况下有效并不足以证明它在任何情况下都有效。

为了证明你的算法,你首先必须写下你的先决条件(你应该有什么)。 然后你必须指出你的程序在你的while循环开始时应该处于的状态,并且在它结束时也是如此。

例如: y=0 我=n 而(i>=0){ // y=Sum(a[j] + x^j, j>i) y=a[i] + x ^ i // 我想它应该是 x^i 而不是 x*y y=总和(a[j] + x^j, j>i-1) i=i-1 // y=Sum(a[j] + x^j, j>i) }

我没有为这个程序找到任何必要的前提条件,我只是在前面提到过,因为它对其他类似的作品来说很重要。 如图所示,这个想法是展示程序在每个点的状态,所以我们知道它到达结束时的状态。

【讨论】:

  • 嗯,但是如果我只是在我的 while 循环的开始和结束时声明我的程序的状态,那是否意味着仍然选择一个特定的多项式?我的意思是我不必给出一个特定的多项式来处理吗?我如何证明它通常适用于所有多项式。
  • 您必须证明它适用于尊重您的先决条件的所有可能条目,因此在这种情况下,适用于所有多项式。这就像在数学中展示一条规则。如果你证明它适用于一个多项式,它并不能证明它适用于所有多项式。所以你必须保持通用性,就像在数学中一样,这使得证明算法的练习变得更加困难^^
  • 啊,天啊。所以我可以感到有点不知所措吗?哈哈。因为现在我有点不知所措。我正在阅读一些关于证明的数学书籍,因为这对我来说很新。我会尽量保持通用,谢谢。 :) 我的教授帮不上忙,我是 CS 的本科生。
猜你喜欢
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2011-04-20
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多