📜  算法分析|第四组(循环分析)

📅  最后修改于: 2021-05-08 17:20:49             🧑  作者: Mango

在之前的文章中,我们讨论了渐近分析,最坏,平均和最佳案例以及渐进符号。在这篇文章中,讨论了使用简单示例对迭代程序进行分析。

1)O(1):如果函数(或语句集)的时间复杂度不包含循环,递归和对任何其他非恒定时间函数的调用,则将其视为O(1)。

// set of non-recursive and non-loop statements

例如,swap()函数的时间复杂度为O(1)。
运行一定次数的循环或递归也被视为O(1)。例如,以下循环为O(1)。

// Here c is a constant   
   for (int i = 1; i <= c; i++) {  
        // some O(1) expressions
   }

2)O(n):如果循环变量递增/递减恒定量,则循环的时间复杂度被视为O(n)。例如,以下函数的时间复杂度为O(n)。

// Here c is a positive integer constant   
   for (int i = 1; i <= n; i += c) {  
        // some O(1) expressions
   }

   for (int i = n; i > 0; i -= c) {
        // some O(1) expressions
   }

3)O(n c ) :嵌套循环的时间复杂度等于执行最里面的语句的次数。例如,以下示例循环的时间复杂度为O(n 2 )

for (int i = 1; i <=n; i += c) {
       for (int j = 1; j <=n; j += c) {
          // some O(1) expressions
       }
   }

   for (int i = n; i > 0; i -= c) {
       for (int j = i+1; j <=n; j += c) {
          // some O(1) expressions
   }

例如,选择排序和插入排序的时间复杂度为O(n 2 )。
4)如果将循环变量除/乘以常数,则将循环的O(Logn)时间复杂度视为O(Logn)。

for (int i = 1; i <=n; i *= c) {
       // some O(1) expressions
   }
   for (int i = n; i > 0; i /= c) {
       // some O(1) expressions
   }

例如,二进制搜索(请参阅迭代实现)具有O(Logn)时间复杂度。让我们从数学上看它是O(Log n)。我们在第一个循环中得到的级数是1,c,c 2 ,c 3 ,…c k 。如果将k等于Log c n,则得到c Log c n ,即n。
5)如果将循环变量按指数形式减少/增加一定量,则将O(LogLogn)的时间复杂度视为O(LogLogn)。

// Here c is a constant greater than 1   
   for (int i = 2; i <=n; i = pow(i, c)) { 
       // some O(1) expressions
   }
   //Here fun is sqrt or cuberoot or any other constant root
   for (int i = n; i > 1; i = fun(i)) { 
       // some O(1) expressions
   }

有关数学详细信息,请参见此内容。
如何结合连续循环的时间复杂度?
当存在连续的循环时,我们将时间复杂度计算为各个循环的时间复杂度之和。

for (int i = 1; i <=m; i += c) {  
        // some O(1) expressions
   }
   for (int i = 1; i <=n; i += c) {
        // some O(1) expressions
   }
   Time complexity of above code is O(m) + O(n) which is O(m+n)
   If m == n, the time complexity becomes O(2n) which is O(n).   

当循环中有多个if,else语句时,如何计算时间复杂度?
如此处所述,最坏情况下的时间复杂度在最佳,平均和最差情况下最有用。因此,我们需要考虑最坏的情况。我们评估if-else条件中的值导致要执行的最大语句数时的情况。
例如,考虑线性搜索函数,其中我们考虑元素出现在末尾或根本不出现的情况。
当代码太复杂而无法考虑所有if-else情况时,我们可以通过忽略if else和其他复杂控制语句来获得一个上限。
如何计算递归函数的时间复杂度?
递归函数的时间复杂度可以写成数学递归关系。要计算时间复杂度,我们必须知道如何解决递归问题。我们很快将在另一篇文章中讨论递归解决技术。

算法分析测验

下一步–算法分析|第4组(解决重复发生)