数据结构学习笔记(学习冒险版)

自用,目前内容为老师上课讲的内容、做题遇到的问题解析、以及自己的总结。

目录

1.时间复杂度和空间复杂度

1.时间复杂度和空间复杂度

时间复杂度:分析算法的执行效率 

一段代码的总执行次数会用T(n)表示,当代码比较多的时候,使用T(n)就有点麻烦了,并且调用函数的时候运算起来也很麻烦,所以算法一般使用T(n)简化的估算值来衡量代码执行的速度,这个简化的估算值叫做时间复杂度。

①如果T(n)=常数,则可以直接估算为1;

②如果T(n)=常数×n+常数,可以直接省略后面的常数,前面的常数可以估算为1,所以它的时间复杂度就是n;

③如果是多项式,我们只需要保留n的最高次项,系数也直接去掉,例如T(n)=5^3+6666n^2+233,其时间复杂度是n^2。

这样的时间复杂度并不完整,要加上O(),①中的时间复杂度为O(1)③中的时间复杂度为O(n^2)。

一些栗子:

void func3(int n)
{
      for(int i=0;i<n;++i)
      {
           for(int j=0;j<n;++j)
           {
                 printf("我今天吃了油闷大虾!");
           }
      }
      for(int i=0;i<n;++i)
      {
                 printf("还吃了爆炒兔肉");
      }
}

其时间复杂度为n^2+n,即O(n^2);

void func(int n)
{
      for(int i=0;i<n;++i)
      {
           for(int j=i;j<n;++j)
           {
                 printf("猪是的念着倒");
           }
      }
}

T(n)=n+(n-1)+(n-2)……+2+1=[2*(n+1)]/2=(1/2)*n^2+1/2=O(n^2)

算法复杂度看执行次数最多的语句,一般是最内的循环语句

void func3(int n)
{
      for(int i=1;i<n;i*=2)
      {
                 printf("孤独的狼请求添加您为好友\n");
      }
}

首先令n分别等于8和16,可以得到T(8)=3,T(16)=4;

观察可以发现,T(8)=3------>  2^3=8  ------>  2^T(8)=8; T(16)=4------>  2^4=16  ------>  2^T(16)=16; 所以T(n)和n的关系就是2的T(n)次方等于n;

利用log公式可知T(n)=\log_2^n,写完整就是3\log_2^n+2,log的底数跟系数是一样的,也需要去掉,最后正确的时间复杂度为O(logn)

以上知识点引用b站up主小古银小学生也能看懂的时间复杂度(大概吧)_哔哩哔哩_bilibili

空间复杂度:是对一个算法在运行过程中临时占用存储空间大小的一个量度,我们用 S(n) 来定义。

计算方法:

1. 空间复杂度 O(1)
如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

变量 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)

2. 空间复杂度 O(n)

int[] m = new int[n]
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

转自:​​​​​​​https://zhuanlan.zhihu.com/p/50479555

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值