算法的时间复杂度

本篇为阅读极客时间
数据结构与算法之美
王争 前Google工程师
讲课的笔记,侵删

时间复杂度

算法的时间复杂度并不是表示执行算法具体用的时间,而是表示代码的执行时间随着数据规模的变化趋势。
例如:


 int cal(int n) {
   int sum = 0;
   int i = 1;
   for (; i <= n; ++i) {
     sum = sum + i;
   }
   return sum;
 }

我们可以假设,执行每行代码的时间是一样的,为Unit_time,那么执行第二行int sum=0的时间为unit_time,执行第三行int i = 1的时间也为unit_time,第四、五行都运行了 n 遍,所以需要 2nunit_time的执行时间,因此总的执行时间为:
T(n) = 2unit_time+2n*unit_time=(2n+2)unit_time。
再例如:


 int cal(int n) {
   int sum = 0;
   int i = 1;
   int j = 1;
   for (; i <= n; ++i) {
     j = 1;
     for (; j <= n; ++j) {
       sum = sum +  i * j;
     }
   }
 }

那么执行第二、三、四行int sum=0的时间为unit_time,执行第五、六行为 n 遍,所以需要 2nunit_time的执行时间,第七、八行代码的是间为n ^ 2unit_time,
因此总的执行时间为:
T(n) = 3unit_time+n^2
unit_time=(n ^ 2+2n+3)unit_time= O(n ^ 2+2n+3)。
当n无穷大时,起决定作用的是第一项,因此上式可以写为: T(n)=O(n ^ 2)
因此可以看到时间复杂度T(n)是与执行次数n成正比。

一般来说,时间复杂度写为:T(n)=O(f(n))。其中,T(n)为总的时间复杂度,f(n)是代码执行的总次数之和,O表示他们成正比。

如何分析时间复杂度

  • 仅关注循环执行次数最多的一段代码。
    我们通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了。
  • 加法法则。
    一段代码的总复杂度=各段代码复杂度之和=量级最大的那段代码的复杂度
  • 乘法法则。
    当有嵌套循环时,嵌套代码复杂度 = 嵌套内外代码复杂度的乘积。

常用的时间复杂度

在这里插入图片描述
其中,O(2^n)与O(n!)是非多项式量级。
注:

  • O(1)表示代码运行复杂度是常量级,不存在循环,递归,不随n的增大而增大
  • O(logn)表示代码如下:

 i=1;
 while (i <= n)  {
   i = i * 2;
 }

每循环一次,i变为原来的2倍,2 ^0 * 2^1*…2x = n,所以x=log2n。
不管底数是2,3还是其他数,都把他表示为logn,因为对数可以相互转换。

  • O(m+n),O(m*n),对于这种情况,m,n是两个数据规模,并且无法知道m,n到底哪个更大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值