有关时间复杂度的问题

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">前一段时间面试大众点评,被面试官问到了有关于嵌套for循环的时间复杂度,回来总结了一下。</span>


在这篇文章中,我们用简单的循环程序进行分析讨论时间复杂度。

1) O(1)

一个函数调用或是一组语句都认为是O(1)的复杂度  (如果没有调用不包含循环,递归或其他非常量复杂度的函数)。

例如函数 swap()  是 O(1)的时间复杂度. 如果循环的次数是一个常量,则也认为是 O(1)

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

2) O(n)

如果在一个大小为n循环中,循环变量按照一个常量C递增或递减,这个循环的复杂度就为O(n).

//这里C为常数    
   for (int i = 1; i <= n; i += c) {  
       //一些 O(1) 的语句
   }
   for (int i = n; i > 0; i -= c) {
       //一些 O(1) 的语句
   }

3) O(nc)

嵌套循环的时间复杂度等于行最内层语句执行的次数。例如,下面的示例循环具有为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(Log n)

如果在一个大小为n循环中,循环变量按照一个常量C的进行倍数的递增或递减,这个循环的复杂度就为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
  }

5) O(Log Log n)

如果在一个大小为n循环中,循环变量是指数级的递增或递减,这个循环的复杂度就为O(Log log n).

// c为比1大的常量 
  for (int i = 2; i <=n; i = pow(i, c)) { 
      // some O(1) expressions
  }
  //这里的 fun 函数可以是sqrt 或 cuberoot 或任何其他恒定的根
  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
}
上面的时间复杂度 O(m) + O(n) = O(m+n)
如果 m == n 就是 O(2n),也可缩写为 O(n) 常量可以忽略不计

如果循环中有许多if …else 如何计算时间复杂度?

一般情况我们只考虑最快情况下的复杂度。例如考虑线性搜索函数,我们只考虑元素出现在最后或没有该元素。

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

递归函数一般可以写成一个数学递推关系。为了计算时间复杂度,我们必须知道如何解决递归公式,这个问题将在后面讨论。

参考:http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/

         http://www.acmerblog.com/analysis-of-loops-5069.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值