当前位置: 首页 > 知识库问答 >
问题:

计算伪代码的时间复杂度

西门骁
2023-03-14

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

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

我对计算循环周围的时间复杂度很困惑,请看看我的评论。

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?

先谢谢!

共有1个答案

柯子琪
2023-03-14

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

但是你不能说循环中的所有东西总是乘以 N。请考虑以下示例

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

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

关键是你的变量如何接近循环边界。如果它按常数步长递增/递减。那么它是线性的。但是如果涉及到其他操作,您需要考虑到这一点。

 类似资料:
  • null null T(n)=O(1)+O(nlogn)=O(nlogn) 但我不确定。有人能帮帮我吗。

  • 我知道嵌套for循环的时间复杂度等于最里面的循环执行的次数。 像外部循环从1到n的每个嵌套循环一样,它应该运行n次,但这里我们有,这使得算法运行的顺序更好。实际上,我在IDE中编写了这段代码,并在循环结束后打印了x的最终结果,对于不同的n值,我看到跳入内部for循环需要将近n倍的时间。 所以我认为这个算法的整个顺序是,但我不确定

  • 我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?

  • 有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。

  • 我已经通过谷歌和堆栈溢出搜索,但我没有找到一个关于如何计算时间复杂度的清晰而直接的解释。 说代码像下面这样简单: 说一个像下面这样的循环: 这将只执行一次。 时间实际上被计算为而不是声明。