1、 算法分析:
两个主要任务=正确性(不变形×单调性)+复杂度
C++等高等语言的基本指令,均等价于常数条RAM的基本指令;在渐进意义下,二者大体相当。
分支转向:goto //算法被隐藏的灵魂
迭代循环:for、while等本质上是if+goto
调用、递归(自我调用) 本质上也是goto
复杂度分析的主要方法:
迭代:级数求和
递归:递归跟踪+递推方程
猜测+验证
2、级数
算术级数:与末项平方同阶
T(n)=1+2+。。。+n=O(n2)
幂方级数:比幂次高出一阶
T(n)=12+22+。。。+n2=O(n3)
几何级数(a>1):与末项同阶
收敛级数:O(1)
调和级数:θ(logn)
对数级数:θ(nlogn)
3、起泡排序
问题:给定n个整数,将他们按照非降序列排列
观察:有序序列中,任意一对相邻元素都是顺序,无序序列中,总有一对相邻元素逆序。
扫描交换:依次比较每一对相邻元素,如有必要,交换次序,直至整趟扫描都没有进行交换,则排序完成,否则继续扫描。
void bubblesort(int A[],int n){
for(bool sorted=false;sorted=!sorted;n--){//逐趟扫描,完全有序时停止,如果上一趟发生交换,则sorted为false,在循环开始时,被sorted=!sorted初始化为true
for(int i=1;i<n;i++){
if(A[i-1]>A[i]){
swap(A[i-1],A[i]);//交换次序函数
sorted=false;//清除有序标志
}
}
}
}
4、封底估算Back-Of-The-Envelope Calculation
这种估算几乎不需要比较,只需要用头脑去抓住问题的主要方面尽快的得出一个问题的足够近似的估计。
实例:全国人口普查1e9,估算用冒泡和归并排序的时间