算法分析| 第4集(循环分析)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法分析| 第4集(循环分析)相关的知识,希望对你有一定的参考价值。

我们在之前的帖子中讨论了渐近分析,  最差,平均和最佳案例 还有渐近符号。

 在这篇文章中,讨论了使用简单示例分析迭代程序。

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

 //非递归和非循环语句集

例如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(log n)。

 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(log 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 > 0; 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情况时,我们可以通过忽略else和其他复杂的控制语句来获得上限。


如何计算递归函数的时间复杂度?


递归函数的时间复杂度可以写成数学递归关系。为了计算时间复杂度,我们必须知道如何解决循环。

我们不久将在单独的一篇文章中来讨论递归解决技术。

 

以上是关于算法分析| 第4集(循环分析)的主要内容,如果未能解决你的问题,请参考以下文章

《图解数据结构与算法》(Java代码实现注释解析算法分析)

[Pytorch系列-59]:循环神经网络 - 中文新闻文本分类详解-1-业务目标分析与总体架构

嵌套循环遍历算法分析比较

第4集 项目结构分析

算法设计与分析——十大经典排序算法一(1--5)

机器学习实战第11章——使用 Apriori 算法进行关联分析