自用,目前内容为老师上课讲的内容、做题遇到的问题解析、以及自己的总结。
目录
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)=,写完整就是3+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