作者引言:明天要进行算法期末考试啦,还是要抓紧时间复习,下面给出了一小段复习内容,如果同样是要进行期末考试的小伙伴们建议好好上课好好看书
1、计算时间复杂度
(1)四个符号:O,o,Ω,θ
前两个可以理解为同阶无穷小和高阶无穷小。
若f(n)=Ω(g(n)),则表示函数f(n)的阶不低于g(n)的阶。
若f(n)=θ(g(n)),则表示函数f(n)的阶等于g(n)的阶。
(2)O的运算规则有:
O(f)+O(g)=O(f+g)
O(f)+O(g)=O(max(f,g))
O(f)O(g)=O(fg)
若f(n)=O(g(n)),则O(f)+O(g)=O(f)
O(Cf(n))=O(f(n)),C为一个正常数
f=O(f)
(3)当计算时间复杂度是一个常数的时候,说明可以解任意规模的问题。
(4)证明n!=o(n^n)
这里用到斯特林公式,使用该公式进行极限求解可得。
2、计算递归程序的时间复杂度
(1)例如T(n)=T(n-1)+1,可以使用齐次线性方程进行求解
具体办法:用最大的n减去最小的n,这里就是n-(n-1)=1,从而得到x1=1。
(2)例如T(n)=T(n/2)+1,则可以使用主定理进行求解。
3、快速排序
就直接上代码吧,思想挺好理解的。
int Partition(int a[],int p,int r){
int i=p,j=r+1;
int x=a[p];
while(true){
while(a[++i]<x && i<r);
while(a[--j]>x);
if(i>=j) break;
swap(a[i],a[j]);
}
a[p]=a[j];
a[j]=x;
return j;
}
void QuickSort(int a[],int p,int r){
if(p<r){
int q = Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
快速排序在数组有序情况下的时间复杂度为O(n^2),其他情况下则是O(nlogn)。
4、动态规划
(1)矩阵连乘问题
这个问题比较经典,详细了解还是需要看书~
(2)动态规划的基本元素(3个)
最优子结构,重叠子问题,备忘录方法。
其中备忘录方法是动态规划算法的变形,动态规划是自底向上递归的,但是备忘录方法是自顶向下递归的。
(3)动态规划和分治法的区别
两者都是讲一个问题分解成若干个子问题,将子问题合并得到原问题的解。但是分治法的子问题之间是互不相干的,而动态规划算法的子问题往往是有重叠的,因此需要用一个表记录下子问题的解,在需要用到的时候直接拿就好了,大大节省计算时间。
(4)最长公共子序列
重要的理解子序列的概念,子序列可以要求序列中的元素不是连续的,只要保持一个下标从低到高的次序就好了。
5、贪心算法
贪心算法主要难在证明贪心策略是否正确以及是否为最优子结构性质。
在证明是否为最优子结构性质时,往往采用反证法进行证明。
贪心算法的一些经典问题:硬币问题、最优装载、活动安排、部分背包问题、哈夫曼编码~