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

如何找到这段代码的时间复杂度?

房时铭
2023-03-14
 sort(S);
 for i=0 to n-2 do
    a = S[i];
    start = i+1;
    end = n-1;
    while (start < end) do
       b = S[start]
       c = S[end];
       if (a+b+c == 0) then
          output a, b, c;
          start = start + 1;
          end = end - 1;
       else if (a+b+c > 0) then
          end = end - 1;
       else
          start = start + 1;
    end
 end

共有1个答案

姬英武
2023-03-14

让我们通过考虑最坏的情况来简化伪代码。

 sort(S); # O(N log(N))

 for i=0 to n-2 do # O(N)

    start = i+1; # O(1)
    end = n-1; # O(1)

    while (start < end) # O(N - i)
       start = start + 1;  # O(1)
    end
 end

也可以写成:

 sort(S); 

 for i=0 to n-2 do 
    for j = i+1 to n-1 do:
       ...
    end
 end

因此迭代次数为

1/2 N * (N+1) = O(N^2)
 类似资料:
  • 我如何发现它的时间和空间复杂性?

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

  • 我有一段代码如下: 谢谢

  • 由于std::sort的时间复杂度为nlog(n),我们有(N1+N2....Nk)次迭代,因此我假设总的时间复杂度为O((N1+N2....+Nk)klog(k))。但是在每次迭代中,vector的大小可能会有所不同,所以我有点困惑。有人能证实这一点吗? 2.我还在leetcode论坛上看到了另一个使用“合并排序”思想的解决方案。它每次都合并两个链表。 我想知道这个解决方案的时间复杂度是多少?因

  • 我已经浏览了Google和Stack Overflow搜索,但是我没有找到一个关于如何计算时间复杂度的清晰而直接的解释 对于下面这样简单的代码: 比如下面这样的循环: 这将只执行一次。时间实际上计算为而不是声明。

  • 我已经阅读了这么多的资源,但仍然无法理解什么是时间复杂性。我阅读的参考资料基于各种公式,我理解用于表示时间复杂性,但我不知道如何表示。谁能请解释这个原则,以一个可以理解的明确的方式请给我。