码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-10-14 17:06:06      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:analysis   递归函数   href   非递归   选择   gre   style   int   之间   

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

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

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集(循环分析)

标签:analysis   递归函数   href   非递归   选择   gre   style   int   之间   

原文地址:http://www.cnblogs.com/wongyi/p/7666973.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!