本笔记整理为方便自行复习,若有他人需求亦可参考。
1.算法基础
(1)算法定义:由有限条指令构成,规定了解决特定问题的一系列操作。
(2)程序定义:程序是算法用某种程序设计语言的具体实现。
(3)区别:程序可以不满足算法的性质:有限性。
(4)算法的评价准则:正确性、时间复杂性、空间复杂性、可读性、健壮性。
2.时间复杂度及渐进表示法
(1)基本运算(关键运算)
算法中起主要作用且耗时最多的操作。
例:矩阵运算中的*与+;
排序算法中的比较;
数组插入/删除操作的赋值(移动)。
(2)时间复杂度
算法中基本运算的次数
问题规模的函数
渐进表示方法:随着规模的增长,算法执行时间T(n)的变化趋势。
O表示法、Ω表示法、Θ表示法。
O:上限
Ω:下限
Θ:上限和下限
例:
T(n)=3logn+loglogn,g(n)=logn
存在C=4,n0=2 当n>n0时,有
3logn+loglogn<=4logn
于是有:T(n)=O(logn)
存在C=3,n0=2 当n>n0时,有
3logn+loglogn>=4logn
于是有:T(n)=Ω(logn)
存在C1=3,C2=4,n0=2 当n>n0时,有
3logn<=3logn+loglogn<=4logn
于是有:T(n)=Θ(logn)
O(n)理解:
T(n)=O(g(n )):存在C,当n足够大,T(n)不会超过g(n)的C倍。
常见时间复杂度:
大小关系:
大O标记常用性质与结果:
忽略常系数、低次项、对数底、对数常数次幂。
级数:
调和级数:
3.典型例题
1.count=0;
for(i=1; i<=n; i++)
for(j=1; j<=i; j++)
count++;`
T(n)=n(n+1)/2
O(n²)
2.`count=0;
for(i=1; i<n; i*=2)
count++;
O(logn)
3.count=0;
for(k=1; k<=n; k*=2)
for(j=1; j<=n; j++)
count++;
O(nlogn)
4.void f ( int n )
{ int i , j;
for ( i = 0; i < n; i++ )
{ j =1;
while ( j<n ) j = j*2;
}
}
O(nlogn)
5.n >=3
for( i=0; i<n-1; i++)
for(j=1; j<n; j=j+ n/3)
for(k=1; k<n; k=k2)
x=x5;
O(nlogn)
6.count=0;
for( i=1; i<=n; i++)
for(j=0; j<n; j+=i)
count++;
O(nlogn)
7.int func(int n){
int i=0, sum=0;
while(sum<n)
sum += ++i;
return i;
}
8.int f (int a[ ], int n, int K){ int i, mid, result=1, s=0, e=n-1; while (s<e){ for(i = s; i <= e; i++) result = result*a[i]; mid = (s+e)/2; if (K < a[mid]) e=mid-1; else if (K > a[mid]) s=mid+1; else break; } return result; }
void f (int a[ ], int n)
{
int i;
int *temp = new int [n];
for(i = 0; i < n; i++)
temp[i] = a[n-i-1];
for(i = 0; i < n; i++)
a[i] = temp[i];
}
空间复杂度:O(n)
4.均摊时间复杂度
分析一个操作序列的总时间而非单个操作的时间。
应用场景:
➢ 对一个数据结构进行一组连续操作;
➢ 大部分情况时间复杂度都很低,只有个别情
况时间复杂度比较高。这些操作之间存在前
后连贯的时序关系;
➢ 这时可以看能否让高时间复杂度的操作的执
行时间平摊到其他低时间复杂度的操作上。