代码的时间复杂度推导

时间:2017-07-25 06:22:32

标签: algorithm time-complexity big-o

使用O表示法找出以下伪代码的时间复杂度。

for (i = 0; i < n; i++) {
  for (j = n; j > 0; j--) {
     if (i < j)
        c = c + 1;
  }
}

1 个答案:

答案 0 :(得分:0)

我认为你是算法领域的新手。我将简要解释一下时间复杂度以及用于对算法进行分类的不同渐近符号,然后您应该能够识别代码的时间复杂度。 在我开始渐近符号之前,我将简要解释一下 -

增长顺序分类 算法的增长顺序根据输入大小说明运行时间的增长情况。幸运的是,只有少量功能足以描述典型算法的增长顺序 - 1Nlog NN log N,{{1} },N^2N^3。记住,我们不是在谈论她的主要常数。通常,当说那个

  

&#34;算法的运行时间比例与N log N&#34;

意味着

  

该算法的实际运行时间为2^N,其中C为   一些不变。

让我们看看这些增长顺序分类告诉我们的内容 -

常量(1):如果代码中没有循环,那么增长顺序将是常量Ex:~ C N log N

对数(log N):如果代码有一个循环,其中输入被分成一半,那么增长的顺序将是对数Ex:

a = b + c

经典示例:二进制搜索算法

线性(N):如果代码有一个触及输入中所有元素的循环,那么增长的顺序就是线性的。例如:

while(N > 1) {
   N = N / 2;
   //followed by other code
}

Linearithmic(N log N):这种特殊的增长顺序可以在分而治之的算法中找到。例如:合并排序

二次(N ^ 2):如果代码有两个 for(int i = 0; i < N; i++) { //... } 循环,触及其大部分元素两次,则表示增长顺序为是    二次。例如:

for

立方(N ^ 3):如果代码具有三 for(int i = 0; i < N; i++) { for(int j = i + 1; j < N; j++) { //.... } } 个循环,那么增长的顺序就是立方数。例如:

for

指数(2 ^ N):任何执行详尽搜索操作的代码,然后该代码的增长顺序称为指数式。例如:查找给定集的所有子集。

对于每种算法,都有最佳情况 - 这是由最简单的输入决定的,并为所有输入提供目标,这意味着实际运行时间不会小于此最坏情况 - 由最困难的输入决定,并为所有输入提供保证,这意味着实际运行时间不会大于此。除了这些情况之外,还有另一种称为平均情况 - 这是由随机输入决定的,它提供了一种预测性能的方法。

因此,我们可以根据增长顺序分析算法的性能。为此,有一些常用的符号称为渐近符号:

  

Big Theta:这个符号只描述了增长的顺序和这个   用于分类算法。如果说算法运行   Theta(N ^ 2),那么它的增长顺序是N ^ 2.

     

大哦:此符号定义了性能的上限。如果   据说算法运行在O(N ^ 2)意味着它小于一些   随着N的增长,恒定时间N ^ 2.

     

Big Omega:此符号定义了性能的下限。如果   算法据说在Omega(N ^ 2)中运行意味着它大于   随着N的增长,一些恒定时间N ^ 2.

所以我希望这篇简短的指南能帮助您了解算法的时间复杂性,现在您可以轻松识别算法的增长顺序。