计算机算法设计与分析
第1章 算法概述
1.1 算法与程序
算法 是解决问题的一种方法或一个过程。
严格地说,算法是由若干条指令组成的有穷序列,且满足下述4条性质。
程序和算法不同。程序不一定满足上述4条性质。
1.2 算法复杂性分析
最坏时间复杂度:O;时间上界;
1.3 NP完全性理论
可在多项式时间内求解的判断问题构成 P类问题。
第2章 递归与分治策略
分治法的思想:将一个难以直接解决的大问题分解为一些规模较小的相同问题,以便各个击破,分而治之。
2.1 递归的概念
直接或间接调用自身的算法称为递归算法。
【例2-1】阶乘函数。
阶乘函数可递归的定义为:
n!=1 ,n=0nn-1! .n>0
递归式的第一式给出了这个函数的 初始值,是非递归定义的(直接给出)。每个递归函数都必须有非递归定义的初始值,否则会一直递归下去。
递归式的第二式用较小的自变量的函数值来表示较大自变量的函数值的方法来定义n的阶乘。
用代码表示:
int factorial(int n){
if (n==0)
return 0;
else
return n*factorial(n-1);
}
【例2-6】Hanoi塔问题
问题略。
可用递归方法解决:
当n=1时,只要将当前盘子从当前位置塔a放在目标塔b即可。
当n>1时,需要利用塔c作为辅助塔,将n-1个圆盘移动到c上,然后将剩下的最大圆盘移动到b上。即n个圆盘的问题变成两次n-1个圆盘的问题。
用代码表示:
//4个参数依次是剩余数量,起点,终点,中间点
void hanoi(int n, char a, char b, char c){
if (n==1)
move(a,b);
else
{
hanoi(n-1,a,c,b);
move(a,b);
hanoi(n-1,c,b,a);
}
}
void move(char begin,char end){
cout< } 2.2 分治法的基本思想 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,子问题之间相互独立且与原问题类型相同。 2.3二分搜索技术 二分搜索是分治的典型例子。 给定已排好序(为了简便,设为升序排序)的n个元素a[0,n-1],要在其中找到一特定元素x。 如果用顺序搜索(从头开始依次往后比较),最坏情况需要n次比较; 二分搜索采用分治策略,最坏情况用O(logn)时间完成。 二分搜索的基本思想:将n个元素分成数量基本相同的两份,取a[n/2]与x比较,如果x 等于a[n/2],则找到,算法终止;如果x
如果x>a[n/2],则x较大,只要在数组a的右半边继续搜索。 /*二分搜索 */ template int BinarySearch(Type a[],const Type& x, int n){ int left = 0; int right = n-1; while(left<=right) { int middle = (left+right)/2; if (x==a[middle]) return middle; if (x>a[middle]) left = middle+1;