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

本文详细介绍了不同类型的循环和递归函数的时间复杂度分析方法,包括O(1), O(n), O(n^2), O(log n) 和 O(log log n)等,并通过具体示例进行说明。

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

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

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和其他复杂的控制语句来获得上限。


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


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

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

 

转载于:https://www.cnblogs.com/wongyi/p/7666973.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值