计算伪代码的时间复杂度

Posted

技术标签:

【中文标题】计算伪代码的时间复杂度【英文标题】:Calculate time complexity of a pseudocode 【发布时间】:2022-01-19 10:20:23 【问题描述】:

我正在尝试分析算法的时间复杂度。

下面的算法只检查数组的一部分,所以如果它没有多大意义,不用担心。

我对计算循环的时间复杂度感到很困惑,请看看我的 cmets。

def search(key,arr) 
   N = arr.length                    C1
   for 0 <= i < ceiling(N/2)         C2*N+C3 - ceiling can be considered a constant. 
      if(arr[i] == key):             C4*N -- Assuming this because its inside the loop?
      return 2*i                     C5*N -- N because of the loop?
   return "Not found"                C6

这是否意味着我们有:

T(N) = (C2+C4+C5)N + (C1+C3+C6)

T(N) = C7*N + (C8)

T(N) = N??

循环中的所有内容总是*N?

提前致谢!

【问题讨论】:

我想应该是 N/2。 【参考方案1】:

你的计算是正确的。这是一个O(n) 算法。

但你不能说循环中的所有内容总是时间N。考虑以下示例:

for i == N; i >= 0; i /= 2:
  ... do some constant stuff

这显然是 N 的对数,因为我们在每次迭代中一半 i

关键是你的变量如何接近循环绑定。如果它以恒定的步骤递增/递减。然后是线性的。但如果涉及到其他一些操作,则需要考虑到这一点。

【讨论】:

所以 if(arr[i] == key): 等于 C4*N,但如果 i 不存在那么它只是 C4?谢谢! 无论你的 for 循环中的任何表达式,即使它没有循环变量,如果每次都有机会计算它,那么你必须将它乘以 N。可能是if True == False:,它没有对i 的任何引用,但被执行N 次。 好的,有道理! :) 对于您的示例,这是因为 i / 2 这意味着在这种情况下这将是恒定时间 * N/2? for i == N; i &gt;= 0; i / 2: ... do some constant stuff 不,应该是log(N) * Constant stuff。这是因为我们每次都将i 除以2。对N 的增量/减量不是恒定的。

以上是关于计算伪代码的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

伪代码与时间复杂度

如何计算算法复杂度

伪多项式算法

SkipList (跳跃表)解析及其实现

根据计算复杂度选择有效的选择器

伪多项式时间 Pseudo-polynomial time