第一章 绪论
- 相比用循环函数,递归函数会占用较多的空间(解决问题方法的效率跟空间的利用效率有关),需要同时存储递归调用的所有函数,直到调用到结束,才释放存储空间。
- 计算多项式时,利用结合律f(x)=a_0+x(a_1+x(…(a_(n-1)+x(a_n ))) (秦九韶算法),所需时间比阶乘算法少,加减法比乘除法快很多。
- 抽象数据类型:面向对象的语言更加好定义
- 类型名称:Matrix
- 数据对象集:<a,i,j>三元组,为矩阵的元素和行列
- 操作集:矩阵乘法、加法等
- 分析复杂度 T(n)时,有“最坏情况复杂度”和“平均复杂度”,常用最坏情况复杂度。
- 大O表示法表示的复杂度的上界,Ω(n)表示复杂度的下界,θ(n)表示上下界相等。
- 复杂度排序:1 < log n < n < n log n < n2 < n3 < 2 n < n!
- 两个算法拼在一起时,复杂度相加;两算法嵌套时,复杂度相乘。
- for循环复杂度为循环次数乘以循环体代码复杂度,if-else结构复杂度为if条件判断和两个分支中,复杂度最大的那个。
- “分而治之”思想、在线处理思想:每输入一个数字即处理,任何时候终止都能得到当前输入的解。
二分查找函数
#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last;
};
List ReadInput();
Position BinarySearch( List L, ElementType X );
int main(){
List L;
ElementType X;
Position P;
L = ReadInput();
scanf("%d", &X);
P = BinarySearch( L, X );
printf("%d\n", P);
return 0;
}
Position BinarySearch(List L, ElementType X){
Position lower,mid,upper,position;
lower = 0;
upper = L->Last;
while(lower<=upper){
mid = (lower + upper) / 2;
if (L -> Data[mid] > X)
upper = mid - 1;
else if ( L -> Data[mid] < X)
lower = mid + 1;
else
return mid;
}
return position;
}