算法设计与分析(第二版) 第1章
《算法设计与分析》第01章
第38页
安师大数学计算机科学学院
2014年6月28日星期六
1.4.3 归纳证明
定理1-1 对于n≥0,程序1-5是正确的。 证明:(归纳法证明) 当n是1位数时,程序显然是正确的。 假定函数PrintDigit对所有位数小于k(k>1)的正 整数都能正确运行,当 n 的位数为 k 位时,此时有 n≥10 ,算法必定先执行语句 cout<<n%10; 然后执 行语句if(n>10) PrintDigit(n/10);。
第31页
安师大数学计算机科学学院
2014年6月28日星期六
可以用所谓的递归树(recursive tree)来描述程 序1-4的函数Fib执行时的调用关系。
图1-2 计算Fib(4)的递归树
第32页
安师大数学计算机科学学院
2014年6月28日星期六
递归数据结构 使用递归方式定义的数据结构称为递归数据结构 (recursive data structure)。
第10页
Begin
Rm%n
Y
r=0? N
Swap(m.n)
End
安师大数学计算机科学学院
2014年6月28日星期六
假设 m=21 和 n=45,求21和45的最大公因子
第一步:r=m%n=21%45=21; 第二步:r 不等于0,转入第三步; 第三步:互换,m=n=45, n=r=21,返回第一步。 第一步:r=m%n=45%21=3; 第二步:r 不等于0,转入第三步; 第三步:互换,m=n=21 , n=r=3,返回第一步。 第一步:r=m%n=21%3=0; 第二步:r 等于0,算法结束,3即为21和45的最大公因子。
2014年6月28日星期六
算法分析与设计 第1章习题答案 1-1,1-2,1-3,1-6
第一章习题(1-1,1-2,1-3,1-6)1-1 求下列函数的渐进表达式3n2+10n = O(n2)n2/10+2n = O(2n)21+1/n = O(1)logn3 = O(logn)10log3n = O(n)知识点:如果存在正的常数C和自然数N0,使得:当N>=N0时有f(N)<=Cg(N),则称f(N)当N充分大时上有界,且g(N)是它的一个上界,记为f(N)=O(g(N)).这时,可以说f(N)的阶不高于g(N)的阶。
1-2 论O(1)和O(2)的区别O(1)和O(2)差别仅在于其中的常数因子,根据渐进上界记号O的定义可知,O(1)=O(2)。
1-3 从低到高排列以下表达式(按渐进阶排列以下表达式)结果:2 logn n2/320n 4n23n n! 分析:当n>=1时,有logn< n2/3当n>=7时,有3n < n!补充:当n>=4时,有logn> n1/31-6 对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=Θ(g(n))。
知识点:f(n)的阶不高于g(n)的阶:f(n)=O(g(n));f(n)的阶不低于g(n)的阶:f(n)=Ω(g(n));f(n)与g(n) 同阶:f(n)=Θ(g(n)) (1)f(n)= logn2 ; g(n)= logn+5f(n)与g(n)同阶,故f(n)=Θ(g(n)) (2) f(n)= logn2 ; g(n)= n1/2当n>=8时,f(n)<=g(n),故f(n)=O(g(n))分析:此类题目不易直接看出阶的高低,可用几个数字代入观察结果。
如依次用n=1, 21, 22, 23, 26, 28, 210 (3) f(n)= n ; g(n)= log2nf(n)=Ω(g(n))(4) f(n)= nlogn+n; g(n)= lognf(n)=Ω(g(n))(5) f(n)= 10 ; g(n)= log10f(n)=Θ(g(n))(6) f(n)= log2n ; g(n)= lognf(n)=Ω(g(n))(7) f(n)= 2n ; g(n)= 100 n2f(n)=Ω(g(n))(8) f(n)= 2n ; g(n)= 3nf(n)=O(g(n))。
算法算法设计与分析课件(第2版)
例2 sum=0; (一次) for(i=1;i<=n;i++) (n次 ) for(j=1;j<=n;j++) (n^2次 ) sum++; (n^2次 ) 解:T(n)=2n^2+n+1 =O(n^2)
例3 a=0;b=1; ① for (i=1;i<=n;i++) ② { s=a+b; ③ b=a; ④ a=s; ⑤ } 解: 语句1的频度:2, 语句2的频度: n, 语句3的频度: n-1, 语句4的频度:n-1, 语句5的频度:n-1, T(n)=2+n+3(n-1)=4n-1=O(n).
例4 i=1; ① while (i<=n) i=i*2; ②
解: 语句1的频度是1, 设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n 取最大值f(n)= log2n, T(n)=O(log2n )
例5: for(i=0;i<n;i++) { for(j=0;j<i;j++) { for(k=0;k<j;k++) x=x+2; } } 解:当i=m时, j 可以取 0,1,...,m-1 , 所以这里 最内循环共进行了0+1+...+m-1=(m-1)m/2 次所以,i从0取到n, 则循环共进行了: 0+(11)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6所以 时间复杂度为O(n^3).
求解如下几个算法的复杂度 例1 Temp=i;i=j;j=temp; 以上三条单个语句的频度均为1,该程序段 的执行时间是一个与问题规模n无关的常数。 算法的时间复杂度为常数阶,记作 T(n)=O(1)。如果算法的执行时 间不随着 问题规模n的增加而增长,即使算法中有上 千条语句,其执行时间也不过是一个较大 的常数。此类算法的时间复杂度是O(1)。
算法设计与分析:第1章 算法分析基础
算法测试
B 291Dprogram testingE
– ( ; – 2984&29F<*-/#
5D7 1?Ftest caseEF>, 29 < F 293;F@29: %0.'!
C +$DdebugE
– (A6=; –
) ;F
9)+*[,1'-FD!V6: 9)+*= #(!)
– =O!S UN#Q [ " 66Q 59
B59[MI!)59X6 Q596
!3[489+*
!3[ >G(
!3X
算法的执行时间绝大部分花在循环 和递归上
• B61( ,*=
#!7 @H
• 42 7&1
– -3%9 !#."; ,
– )
< +:!#;42>$7 &1>* +:7 &1
• ')(/
– % 0=')8(/ 6(/
1.3.3 算法复杂度
时间复杂度( time complexity )
• • #
课程介绍
n )*
– #/) –
!.3(- 31:
n )*$,
6&"%9 – 57"%20(+ – 57"9'
n4
— 8
主要内容
1. 算法的基本概念和常见符号 2. 算法设计的常用技术
• 递归法、蛮力法、分治法、减治法 • 贪心法、动态规划、回溯法、分支限界法 • 概率算法、近似算法、计算复杂性理论 3. 算法的评价:复杂度分析
引言
1.1 算法概述
算法设计与分析 王红梅 第二版 第1章 算法设计基础复习进程
2020/6/3
Algorithm Introduction
12
算法的描述方法
#include <iostream.h>
int CommonFactor (int m, int n)
欧{ 几 int r=m % n;
里 德
while (r!=0) {
m=n;
算
n=r;
法 r=m % n; } return m; }
例1.2 求两个自然数的最大公约数 [想法1]用短除法找出两个数的公因子,再相乘就
是最大公约数。 [算法1]找两个数的公因子目前只能用蛮力法逐个
尝试,用2-min(m,n)进行枚举尝试。
2020/6/3
Algorithm Introduction
20
算法在问题求解中的地位
算法1.1:CommFactorl(伪代码) 输入:两个自然数m和n 输出:m和n的最大公约数 1. factor=1; 2. 循环变量i从2~min(m,n),执行下述操作;
这是算法吗?
为什么?
2020/6/3
Algorithm Introduction
5
算法及其重要特性
程序?
是算法用某种程序设计语言的具体实现。程序可以不满 足算法的性质(3),即有穷性。
“好算法”的重要特性: (1)正确性:合法的输入,都会得出正确的结果 (2)健壮性:非法的输入,应能识别并处理 (3)可理解性:可读性,易理解 (4)抽象分级:通过抽象分级减少求解步骤 (5)高效性:时间和空间效率
2020/6/3
Algorithm Introduction
27
1. 查找问题 2. 排序问题 3. 图问题 4. 组合问题 5. 几何问题
第1章 算法设计与分析
问题
• 那个排序算法效率最高? • 是否可以找到更好的算法?排序问题的计算难度如何估计?
例3 货郎问题
货郎问题:
• 有穷个城市的集合C = { c1, c2, …, cm}, 距离 d(ci, cj) = d(cj, ci)Z+, 1 i < j m • 求 1, 2 …, m 的排列 k1, k2, …, km使得
A(n) IS t I pI
A( n) i
i 1 n
p p( n 1) (1 p)n (1 p)n n 2
1.3.1 什么是好的算法
好的算法 一个好的算法应具有以下4个重要特性: 1.正确性(correctness):算法的执行结果应 当满足预先规定的功能和性能要求。 2.简明性(simplicity):算法应思路清晰、层 次分明、容易理解、利于编码和调试。 3.效率(efficiency):算法应有效使用存储空 间,并具有高的时间效率。 4.最优性(optimality):算法的执行时间已达 到求解该类问题所需时间的下界。
• 一个程序步(program step)是指在语法上或语 义上有意义的程序段,该程序段的执行时间必须 与问题实例的规模无关。
【程序2-1】 求数组元素累加之和的迭代程序 float Sum(float list[], const int n) { float tempsum=0.0; count ++; //针对赋值语句 for (int i=0; i<n; i++ ){ count ++; //针对for循环语句 tempsum+ =list[i]; count ++; //针对赋值语句 } count ++; //针对for的最后一次执行 count ++; //针对return语句 return tempsum; }
算法设计与分析-王-第1章-算法设计基础
2)有没有已经解决了的类似问题可供借鉴?
1.4 算法设计的一般过程
在模型建立好了以后,应该依据所选定的模型对问 题重新陈述,并考虑下列问题: (1)模型是否清楚地表达了与问题有关的所有重要
的信息?
(2)模型中是否存在与要求的结果相关的数学量? (3)模型是否正确反映了输入、输出的关系? (4)对这个模型处理起来困难吗?
程序设计研究的四个层次:
算法→方法学→语言→工具
理由2:提高分析问题的能力
算法的形式化→思维的逻辑性、条理性
1.2 算法及其重要特性
一、算法以及算法与程序的区别
例:欧几里德算法——辗转相除法求两个自然数 m 和 n 的最大公约数
m n
欧几里德算法
r
1.2 算法及其重要特性
欧几里德算法
① 输入m 和nห้องสมุดไป่ตู้如果m<n,则m、n互换;
对不合法的输入能作出相适应的反映并进行处理。 (2) 健壮性(robustness): 算法对非法输入的抵抗能力, 即对于错误的输入,算法应能识别并做出处理,而不是 产生错误动作或陷入瘫痪。 (3)可读性:算法容易理解和实现,它有助于人们对算 法的理解、调试和修改。 (4) 时间效率高:运行时间短。 (5) 空间效率高:占用的存储空间尽量少。
算法设计与分析
Design and Analysis of Computer Algorithms
高曙
教材:
算法设计与分析(第二版),清华大学出版社,王红梅, 胡明 编著
参考书目:
Introduction to Algorithms, Third Edition, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest,机械工 业出版社,2012
算法设计与分析(第2版) 郑宗汉 第1章-1
8
Байду номын сангаас
学习要求
深刻理解每一类算法的思想及其实现
能熟练运用所学知识解决实际问题
培养提高计算思维能力
9
考核方式
Homework and Reading: 20%
Final Exam (Written Test): 80%
10
第1章 算法的基本概念
1.1 引言
1.1.1 算法的定义和特性
c %3 0
(1.1.3)
16
1.1.2 算法的设计和复杂性分析
百鸡问题的穷举法
输入:所购买的3种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_question(int n, int &k, int g[], int m[], int s[]) 2. { 3. int a,b,c; 分析发现:只能买到n/5 4. k = 0; 只公鸡,n/3只母鸡,将 5. for (a = 0; a <= n; a++) { 算法进行改进。 6. for ( b = 0; b <= n; b++) { 7. for (c = 0; c <= n; c++) { 8. if ((a + b + c == n) && (5 * a + 3 * b + c / 3 == n) && (c%3 == 0)) { 9. g[k] = a; 10. m[k] = b; 11. s[k] = c; 12. k++; 13. } 14. } 15. } 16. } 17. }
算法设计与分析(第2版)-王红梅-胡明-习题答案(1)
算法设计与分析(第2版)-王红梅-胡明-习题答案习题11. 图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图 1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法1.r=m-n2.循环直到r=02.1 m=n图1.7 七桥问题2.2 n=r2.3 r=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C++描述。
//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high){int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法设计与分析(第2版)
出版工作
2018年8月1日,该教材由清华大学出版社出版。
内容简介
内容简介
全书由12章构成,各章的内容如下。
第1章概论:介绍算法的概念、算法分析方法和STL在算法设计中的应用。
教材目录
教材目录
(注:目录排版顺序为从左列至右列 )
教学资源
教学资源
该教材配有配套教材——《算法设计与分析(第2版)学习与实验指导》,该配套教材涵盖所有练习题、上 机实验题和在线编程题的参考答案。
该教材每个知识点都配套了视频讲解,提供PPT课件、源码、答案、教学大纲、题库、书中全部源程序代码 (在VC++6.0中调试通过)等教学资源。
算法设计与分析(第2版)
20xx年清华大学出版社出版的图书
01 成书过程
03 教材目录源 06 作者简介
基本信息
《算法设计与分析(第2版)》是由李春葆主编,2018年清华大学出版社出版的高等学校数据结构课程系列 教材。该教材适合作为高等院校“算法设计与分析”课程的教材,也可供ACM和各类程序设计竞赛者参考。
第5章回溯法:介绍解空间概念和回溯法算法框架,讨论采用回溯法求解0/1背包问题、装载问题、子集和问 题、n皇后问题、图的m着色问题、任务分配问题、活动安排问题和流水作业调度问题的典型算法。
第6章分枝限界法:介绍分枝限界法的特点和算法框架、队列式分枝限界法和优先队列式分枝限界法,讨论 采用分枝限界法求解0/1背包问题、图的单源最短路径、任务分配问题和流水作业调度问题的典型算法。
该教材介绍了各种常用的算法设计策略,包括递归、分治法、蛮力法、回溯法、分枝限界法、贪心法、动态 规划、概率算法和近似算法等,并讨论了各种图算法和计算几何设计算法。书中配有图表、练习题、上机实验题 和在线编程题。
计算机算法设计与分析--第1章 算法概述
③确认算法。算法确认的目的是使人们确信这一算 法能够正确无误地工作,即该算法具有可计算性。 正确的算法用计算机算法语言描述,构成计算机程 序,计算机程序在计算机上运行,得到算法运算的 结果; ④ 分析算法。算法分析是对一个算法需要多少计算 时间和存储空间作定量的分析。分析算法可以预测 这一算法适合在什么样的环境中有效地运行,对解 决同一问题的不同算法的有效性作出比较; ⑤ 验证算法。用计算机语言描述的算法是否可计算、 有效合理,须对程序进行测试,测试程序的工作由 调试和作时空分布图组成。
16
算法描述
1. 从第一个元素开始,该元素可以认为已 经被排序 2. 取出下一个元素,在已经排序的元 素序列中从后向前扫描 3. 如果该元素(已排序)大于新元素, 将该元素移到下一位置 4. 重复步骤3,直到找到已排序的元素 小于或者等于新元素的位置 5. 将新元素插入到该位置中 6. 重复步骤2
15
1.3 算法示例—插入排序算法
算法的思想:扑克牌游戏
a0,...,n-1 a0,...,n-1 a0,...,n-1 a0,...,n-1 a0,...,n-1 a0,...,n-1 a0,...,n-1
= = = = = = =
5,2,4,6,1,3 5,2,4,6,1,3 2,5,4,6,1,3 2,4,5,6,1,3 2,4,5,6,1,3 1,2,4,5,6,3 1,2,3,4,5,6
8
算法≠程序
算法描述:自然语言,流程图,程序设计
语言,伪代码 用各种算法描述方法所描述的同一算法, 该算法的功用是一样的,允许在算法的描述 和实现方法上有所不同。
本书中采用类C++伪代码语言描述算法
9
人们的生产活动和日常生活离不开算法, 都在自觉不自觉地使用算法,例如人们到 商店购买物品,会首先确定购买哪些物品, 准备好所需的钱,然后确定到哪些商场选 购、怎样去商场、行走的路线,若物品的 质量好如何处理,对物品不满意又怎样处 理,购买物品后做什么等。以上购物的算 法是用自然语言描述的,也可以用其他描 述方法描述该算法。
算法设计与分析(第2版)-郑宗汉-第1章-1
2021/3/10
5
第1章 算法的基本概念
References
1973. 5. A. V. Aho, J. D. Ullman等. The Design and Analysis of Computer Algorithms.
Addison-Wesley, 1974. 6. A. V. Aho, J. D. Ullman等. Data Structures and Algorithms. Addison-Wesley,
1983.4. 7. S. Baase. Computer Algorithms: Introduction to Design and Analysis.
Addison-Wesley, second edition, 1988. 8. E. Horowitz and Sartaj Sahni. Fundamentals of Computer Algorithms.
2021/3/10
12
第1章 算法的基本概念 1.1.1 算法的定义和特性
最大公约数问题:求两个正整数m和n的最大公约数
设计:
确可定行性性::
输入: 输出: 第一步: 第二步:
2021/3/10
8
第1章 算法的基本概念
学习要求
深刻理解每一类算法的思想及其实现 能熟练运用所学知识解决实际问题 培养提高计算思维能力
2021/3/10
9
第1章 算法的基本概念
算法设计与分析(第2版)
2016年2月1日,该教材由清华大学出版社出版。
内容简介
该教材为计算机类专业核心课程“算法设计与分析”教材,全书以算法设计技术和分析方法为主线来组织各 知识单元。全书共10章,第1章是基础知识,介绍和算法设计与分析有关的基本概念、符号和数学知识;第2~5章 分别阐述分治策略、动态规划、贪心法、回溯与分支限界等算法设计技术;第6章介绍算法分析与问题的计算复杂 度;第7章是NP完全性理论;第8章是近似算法;第9章是随机算法;第10章介绍处理难解问题的策略。
该教材的主要特点是:
作者简介
屈婉玲,女,北京大学信息科学技术学院及软件与微电子学院教授、博士生导师。主讲算法分析与复杂性理 论、算法分析与设计等研究生必修课。研究方向为算法设计与分析、软件形式化方法。
刘田,博士,北京大学信息科学技术学院副教授。主要研究方向为算法分析与计算复杂性理论。长期主讲 “集合论与图论”、“理论计算机科学基础”等课程,2006年和2013年先后两次获得了北京大学教学优秀奖。
算法设计与分析(第2版)
20xx年清华大学出版社出版的图书
01 成书过程
03 教材目录 05 教材特色
目录
02 内容简介设计与分析(第2版)》是由屈婉玲、刘田、张立昂、王捍贫编著,2016年清华大学出版社出版的21 世纪大学本科计算机专业系列教材、普通高等教育“十一五”国家级规划教材。该教材适合作为大学计算机科学 与技术、软件工程、信息安全、信息与计算科学等专业本科生和研究生的教学用书,也可以作为从事实际问题求 解的算法设计与分析工作的科技人员的参考。
该教材为计算机类专业核心课程“算法设计与分析”教材,全书以算法设计技术和分析方法为主线来组织各 知识单元,主要内容包括基础知识、分治策略、动态规划、贪心法等。
清华大学第二版算法分析与设计课件第一章pdf
An algorithm is a sequence of unambiguous instructions for solving a problem, i.e., for obtaining a required output for any legitimate input in a finite amount of time.
• Theoretical analysis • Empirical analysis
Optimality
Design and Analysis of Algorithms - Chapter 1 7
Algorithm design strategies
Brute force Divide and conquer Decrease and conquer Transform and conquer
Instance: The sequence <5, 3, 2, 8, 3> Algorithms:
• • • • Selection sort Insertion sort Merge sort (many others)
Design and Analysis of Algorithmsign and Analysis of Algorithms - Chapter 1
2
Notion of algorithm
problem
algorithm
input
“computer”
output
Algorithmic solution
Design and Analysis of Algorithms - Chapter 1 3
9
What is an algorithm?
算法设计与分析耿国华第一章
(2i 1) n
i 1
n
2
(2i 1) (2i 1) 2n 1 (n 1)
i 1 i 1
2
2n 1 n 2
故命题成立。
Chapter
1
1.5 算法复杂性分析方法
1.5.1 复杂度函数
1.5.2 最好、最坏和平均情况
1.5.3 渐进分析 1.5.4 阶的证明方法
Chapter
1
1.3 算法分析准则
分析准则
(4)高效率和低存能量 评价算法性能另一个要考虑的因素就是算法的运行效率,也 就是要估计一下按算法编制的程序在计算机上执行所耗费的时 间和所占用空间。 评价算法运行效率的主要技术指标是:算法运行的时间复杂 度和空间复杂度。
Chapter
1
1.4 算法分析基础
Chapter
1
1.1 引言----算法特性
• 算法特性
(1)有限性:
一个算法必须保证执行有限步之后结束
(2)确定性(无二义)
算法的每一步骤必须有确切的定义
(3)可行性
算法原则上能精确地运行。在现有条件情况下,是可以
实现的 。
Chapter
1
1.1 引言----算法特性• 算法特性(4)输入
一个算法有0个或多个输入,以刻画运算对象的初始情况
Chapter
1
1.1 引言----算法描述方式
• 算法的描述方式
(1)自然语言
所谓的“自然语言”指的是日常生活中使用的语言,如汉语、 英 语。用自然语言进行描述通俗易懂,容易掌握,但是不 严谨、容易有二义性。
(2)框图(流程图)
它是用各种几何图形、流程线及文字说明来描述计算过程的 框图。直观地表示算法的整个结构,着重处理流程,便于检查 修改。但是它无法表达数据流程。
算法设计与分析习题解答(第2版)
第1章算法引论11.1 算法与程序11.2 表达算法的抽象机制11.3 描述算法31.4 算法复杂性分析13小结16习题17第2章递归与分治策略192.1 递归的概念192.2 分治法的基本思想262.3 二分搜索技术272.4 大整数的乘法282.5 Strassen矩阵乘法302.6 棋盘覆盖322.7 合并排序342.8 快速排序372.9 线性时间选择392.10 最接近点对问题432.11 循环赛日程表53小结54习题54第3章动态规划613.1 矩阵连乘问题62目录算法设计与分析(第2版)3.2 动态规划算法的基本要素67 3.3 最长公共子序列713.4 凸多边形最优三角剖分753.5 多边形游戏793.6 图像压缩823.7 电路布线853.8 流水作业调度883.9 0-1背包问题923.10 最优二叉搜索树98小结101习题102第4章贪心算法1074.1 活动安排问题1074.2 贪心算法的基本要素1104.2.1 贪心选择性质1114.2.2 最优子结构性质1114.2.3 贪心算法与动态规划算法的差异1114.3 最优装载1144.4 哈夫曼编码1164.4.1 前缀码1174.4.2 构造哈夫曼编码1174.4.3 哈夫曼算法的正确性1194.5 单源最短路径1214.5.1 算法基本思想1214.5.2 算法的正确性和计算复杂性123 4.6 最小生成树1254.6.1 最小生成树性质1254.6.2 Prim算法1264.6.3 Kruskal算法1284.7 多机调度问题1304.8 贪心算法的理论基础1334.8.1 拟阵1334.8.2 带权拟阵的贪心算法1344.8.3 任务时间表问题137小结141习题141第5章回溯法1465.1 回溯法的算法框架1465.1.1 问题的解空间1465.1.2 回溯法的基本思想1475.1.3 递归回溯1495.1.4 迭代回溯1505.1.5 子集树与排列树1515.2 装载问题1525.3 批处理作业调度1605.4 符号三角形问题1625.5 n后问题1655.6 0\|1背包问题1685.7 最大团问题1715.8 图的m着色问题1745.9 旅行售货员问题1775.10 圆排列问题1795.11 电路板排列问题1815.12 连续邮资问题1855.13 回溯法的效率分析187小结190习题191第6章分支限界法1956.1 分支限界法的基本思想1956.2 单源最短路径问题1986.3 装载问题2026.4 布线问题2116.5 0\|1背包问题2166.6 最大团问题2226.7 旅行售货员问题2256.8 电路板排列问题2296.9 批处理作业调度232小结237习题238第7章概率算法2407.1 随机数2417.2 数值概率算法2447.2.1 用随机投点法计算π值2447.2.2 计算定积分2457.2.3 解非线性方程组2477.3 舍伍德算法2507.3.1 线性时间选择算法2507.3.2 跳跃表2527.4 拉斯维加斯算法2597.4.1 n 后问题2607.4.2 整数因子分解2647.5 蒙特卡罗算法2667.5.1 蒙特卡罗算法的基本思想2667.5.2 主元素问题2687.5.3 素数测试270小结273习题273第8章 NP完全性理论2788.1 计算模型2798.1.1 随机存取机RAM2798.1.2 随机存取存储程序机RASP2878.1.3 RAM模型的变形与简化2918.1.4 图灵机2958.1.5 图灵机模型与RAM模型的关系297 8.1.6 问题变换与计算复杂性归约299 8.2 P类与NP类问题3018.2.1 非确定性图灵机3018.2.2 P类与NP类语言3028.2.3 多项式时间验证3048.3 NP完全问题3058.3.1 多项式时间变换3058.3.2 Cook定理3078.4 一些典型的NP完全问题3108.4.1 合取范式的可满足性问题3118.4.2 3元合取范式的可满足性问题312 8.4.3 团问题3138.4.4 顶点覆盖问题3148.4.5 子集和问题3158.4.6 哈密顿回路问题3178.4.7 旅行售货员问题322小结323习题323第9章近似算法3269.1 近似算法的性能3279.2 顶点覆盖问题的近似算法3289.3 旅行售货员问题近似算法3299.3.1 具有三角不等式性质的旅行售货员问题330 9.3.2 一般的旅行售货员问题3319.4 集合覆盖问题的近似算法3339.5 子集和问题的近似算法3369.5.1 子集和问题的指数时间算法3369.5.2 子集和问题的完全多项式时间近似格式337 小结340习题340第10章算法优化策略34510.1 算法设计策略的比较与选择34510.1.1 最大子段和问题的简单算法34510.1.2 最大子段和问题的分治算法34610.1.3 最大子段和问题的动态规划算法34810.1.4 最大子段和问题与动态规划算法的推广349 10.2 动态规划加速原理35210.2.1 货物储运问题35210.2.2 算法及其优化35310.3 问题的算法特征35710.3.1 贪心策略35710.3.2 对贪心策略的改进35710.3.3 算法三部曲35910.3.4 算法实现36010.3.5 算法复杂性36610.4 优化数据结构36610.4.1 带权区间最短路问题36610.4.2 算法设计思想36710.4.3 算法实现方案36910.4.4 并查集37310.4.5 可并优先队列37610.5 优化搜索策略380小结388习题388第11章在线算法设计39111.1 在线算法设计的基本概念39111.2 页调度问题39311.3 势函数分析39511.4 k 服务问题39711.4.1 竞争比的下界39711.4.2 平衡算法39911.4.3 对称移动算法39911.5 Steiner树问题40311.6 在线任务调度40511.7 负载平衡406小结407习题407词汇索引409参考文献415习题1-1 实参交换1习题1-2 方法头签名1习题1-3 数组排序判定1习题1-4 函数的渐近表达式2习题1-5 O(1) 和 O(2) 的区别2习题1-7 按渐近阶排列表达式2习题1-8 算法效率2习题1-9 硬件效率3习题1-10 函数渐近阶3习题1-11 n !的阶4习题1-12 平均情况下的计算时间复杂性4算法实现题1-1 统计数字问题4算法实现题1-2 字典序问题5算法实现题1-3 最多约数问题6算法实现题1-4 金币阵列问题8算法实现题1-5 最大间隙问题11第2章递归与分治策略14 习题2-1 Hanoi 塔问题的非递归算法14习题2-2 7个二分搜索算法15习题2-3 改写二分搜索算法18习题2-4 大整数乘法的 O(nm log(3/2))算法19习题2-5 5次 n /3位整数的乘法19习题2-6 矩阵乘法21习题2-7 多项式乘积21习题2-8 不动点问题的 O( log n) 时间算法22习题2-9 主元素问题的线性时间算法22习题2-10 无序集主元素问题的线性时间算法22习题2-11 O (1)空间子数组换位算法23习题2-12 O (1)空间合并算法25习题2-13 n 段合并排序算法32习题2-14 自然合并排序算法32习题2-15 最大值和最小值问题的最优算法35习题2-16 最大值和次大值问题的最优算法35习题2-17 整数集合排序35习题2-18 第 k 小元素问题的计算时间下界36习题2-19 非增序快速排序算法37习题2-20 随机化算法37习题2-21 随机化快速排序算法38习题2-22 随机排列算法38习题2-23 算法qSort中的尾递归38习题2-24 用栈模拟递归38习题2-25 算法select中的元素划分39习题2-26 O(n log n) 时间快速排序算法40习题2-27 最接近中位数的 k 个数40习题2-28 X和Y 的中位数40习题2-29 网络开关设计41习题2-32 带权中位数问题42习题2-34 构造Gray码的分治算法43习题2-35 网球循环赛日程表44目录算法设计与分析习题解答(第2版)算法实现题2-1 输油管道问题(习题2-30) 49算法实现题2-2 众数问题(习题2-31) 50算法实现题2-3 邮局选址问题(习题2-32) 51算法实现题2-4 马的Hamilton周游路线问题(习题2-33) 51算法实现题2-5 半数集问题60算法实现题2-6 半数单集问题62算法实现题2-7 士兵站队问题63算法实现题2-8 有重复元素的排列问题63算法实现题2-9 排列的字典序问题65算法实现题2-10 集合划分问题(一)67算法实现题2-11 集合划分问题(二)68算法实现题2-12 双色Hanoi塔问题69算法实现题2-13 标准二维表问题71算法实现题2-14 整数因子分解问题72算法实现题2-15 有向直线2中值问题72第3章动态规划76习题3-1 最长单调递增子序列76习题3-2 最长单调递增子序列的 O(n log n) 算法77习题3-7 漂亮打印78习题3-11 整数线性规划问题79习题3-12 二维背包问题80习题3-14 Ackermann函数81习题3-17 最短行驶路线83习题3-19 最优旅行路线83算法实现题3-1 独立任务最优调度问题(习题3-3) 83算法实现题3-2 最少硬币问题(习题3-4) 85算法实现题3-3 序关系计数问题(习题3-5) 86算法实现题3-4 多重幂计数问题(习题3-6) 87算法实现题3-5 编辑距离问题(习题3-8) 87算法实现题3-6 石子合并问题(习题3-9) 89算法实现题3-7 数字三角形问题(习题3-10) 91算法实现题3-8 乘法表问题(习题3-13) 92算法实现题3-9 租用游艇问题(习题3-15) 93算法实现题3-10 汽车加油行驶问题(习题3-16) 95算法实现题3-11 圈乘运算问题(习题3-18) 96算法实现题3-12 最少费用购物(习题3-20) 102算法实现题3-13 最大长方体问题(习题3-21) 104算法实现题3-14 正则表达式匹配问题(习题3-22) 105算法实现题3-15 双调旅行售货员问题(习题3-23) 110算法实现题3-16 最大 k 乘积问题(习题5-24) 111算法实现题3-17 最小 m 段和问题113算法实现题3-18 红黑树的红色内结点问题115第4章贪心算法123 习题4-2 活动安排问题的贪心选择123习题4-3 背包问题的贪心选择性质123习题4-4 特殊的0-1背包问题124习题4-10 程序最优存储问题124习题4-13 最优装载问题的贪心算法125习题4-18 Fibonacci序列的Huffman编码125习题4-19 最优前缀码的编码序列125习题4-21 任务集独立性问题126习题4-22 矩阵拟阵126习题4-23 最小权最大独立子集拟阵126习题4-27 整数边权Prim算法126习题4-28 最大权最小生成树127习题4-29 最短路径的负边权127习题4-30 整数边权Dijkstra算法127算法实现题4-1 会场安排问题(习题4-1) 128算法实现题4-2 最优合并问题(习题4-5) 129算法实现题4-3 磁带最优存储问题(习题4-6) 130算法实现题4-4 磁盘文件最优存储问题(习题4-7) 131算法实现题4-5 程序存储问题(习题4-8) 132算法实现题4-6 最优服务次序问题(习题4-11) 133算法实现题4-7 多处最优服务次序问题(习题4-12) 134算法实现题4-8 d 森林问题(习题4-14) 135算法实现题4-9 汽车加油问题(习题4-16) 137算法实现题4-10 区间覆盖问题(习题4-17) 138算法实现题4-11 硬币找钱问题(习题4-24) 138算法实现题4-12 删数问题(习题4-25) 139算法实现题4-13 数列极差问题(习题4-26) 140算法实现题4-14 嵌套箱问题(习题4-31) 140算法实现题4-15 套汇问题(习题4-32) 142算法实现题4-16 信号增强装置问题(习题5-17) 143算法实现题4-17 磁带最大利用率问题(习题4-9) 144算法实现题4-18 非单位时间任务安排问题(习题4-15) 145算法实现题4-19 多元Huffman编码问题(习题4-20) 147算法实现题4-20 多元Huffman编码变形149算法实现题4-21 区间相交问题151算法实现题4-22 任务时间表问题151第5章回溯法153习题5\|1 装载问题改进回溯法(一)153习题5\|2 装载问题改进回溯法(二)154习题5\|4 0-1背包问题的最优解155习题5\|5 最大团问题的迭代回溯法156习题5\|7 旅行售货员问题的费用上界157习题5\|8 旅行售货员问题的上界函数158算法实现题5-1 子集和问题(习题5-3) 159算法实现题5-2 最小长度电路板排列问题(习题5-9) 160算法实现题5-3 最小重量机器设计问题(习题5-10) 163算法实现题5-4 运动员最佳匹配问题(习题5-11) 164算法实现题5-5 无分隔符字典问题(习题5-12) 165算法实现题5-6 无和集问题(习题5-13) 167算法实现题5-7 n 色方柱问题(习题5-14) 168算法实现题5-8 整数变换问题(习题5-15) 173算法实现题5-9 拉丁矩阵问题(习题5-16) 175算法实现题5-10 排列宝石问题(习题5-16) 176算法实现题5-11 重复拉丁矩阵问题(习题5-16) 179算法实现题5-12 罗密欧与朱丽叶的迷宫问题181算法实现题5-13 工作分配问题(习题5-18) 183算法实现题5-14 独立钻石跳棋问题(习题5-19) 184算法实现题5-15 智力拼图问题(习题5-20) 191算法实现题5-16 布线问题(习题5-21) 198算法实现题5-17 最佳调度问题(习题5-22) 200算法实现题5-18 无优先级运算问题(习题5-23) 201算法实现题5-19 世界名画陈列馆问题(习题5-25) 203算法实现题5-20 世界名画陈列馆问题(不重复监视)(习题5-26) 207 算法实现题5-21 部落卫队问题(习题5-6) 209算法实现题5-22 虫蚀算式问题211算法实现题5-23 完备环序列问题214算法实现题5-24 离散01串问题217算法实现题5-25 喷漆机器人问题218算法实现题5-26 n 2-1谜问题221第6章分支限界法229习题6-1 0-1背包问题的栈式分支限界法229习题6-2 用最大堆存储活结点的优先队列式分支限界法231习题6-3 团顶点数的上界234习题6-4 团顶点数改进的上界235习题6-5 修改解旅行售货员问题的分支限界法235习题6-6 解旅行售货员问题的分支限界法中保存已产生的排列树237 习题6-7 电路板排列问题的队列式分支限界法239算法实现题6-1 最小长度电路板排列问题一(习题6-8) 241算法实现题6-2 最小长度电路板排列问题二(习题6-9) 244算法实现题6-3 最小权顶点覆盖问题(习题6-10) 247算法实现题6-4 无向图的最大割问题(习题6-11) 250算法实现题6-5 最小重量机器设计问题(习题6-12) 253算法实现题6-6 运动员最佳匹配问题(习题6-13) 256算法实现题6-7 n 后问题(习题6-15) 259算法实现题6-8 圆排列问题(习题6-16) 260算法实现题6-9 布线问题(习题6-17) 263算法实现题6-10 最佳调度问题(习题6-18) 265算法实现题6-11 无优先级运算问题(习题6-19) 268算法实现题6-12 世界名画陈列馆问题(习题6-21) 271算法实现题6-13 骑士征途问题274算法实现题6-14 推箱子问题275算法实现题6-15 图形变换问题281算法实现题6-16 行列变换问题284算法实现题6-17 重排 n 2宫问题285算法实现题6-18 最长距离问题290第7章概率算法296习题7-1 模拟正态分布随机变量296习题7-2 随机抽样算法297习题7-3 随机产生 m 个整数297习题7-4 集合大小的概率算法298习题7-5 生日问题299习题7-6 易验证问题的拉斯维加斯算法300习题7-7 用数组模拟有序链表300习题7-8 O(n 3/2)舍伍德型排序算法300习题7-9 n 后问题解的存在性301习题7-11 整数因子分解算法302习题7-12 非蒙特卡罗算法的例子302习题7-13 重复3次的蒙特卡罗算法303习题7-14 集合随机元素算法304习题7-15 由蒙特卡罗算法构造拉斯维加斯算法305习题7-16 产生素数算法306习题7-18 矩阵方程问题306算法实现题7-1 模平方根问题(习题7-10) 307算法实现题7-2 集合相等问题(习题7-17) 309算法实现题7-3 逆矩阵问题(习题7-19) 309算法实现题7-4 多项式乘积问题(习题7-20) 310算法实现题7-5 皇后控制问题311算法实现题7-6 3-SAT问题314算法实现题7-7 战车问题315算法实现题7-8 圆排列问题317算法实现题7-9 骑士控制问题319算法实现题7-10 骑士对攻问题320第8章NP完全性理论322 习题8-1 RAM和RASP程序322习题8-2 RAM和RASP程序的复杂性322习题8-3 计算 n n 的RAM程序322习题8-4 没有MULT和DIV指令的RAM程序324习题8-5 MULT和DIV指令的计算能力324习题8-6 RAM和RASP的空间复杂性325习题8-7 行列式的直线式程序325习题8-8 求和的3带图灵机325习题8-9 模拟RAM指令325习题8-10 计算2 2 n 的RAM程序325习题8-11 计算 g(m,n)的程序 326习题8-12 图灵机模拟RAM的时间上界326习题8-13 图的同构问题326习题8-14 哈密顿回路327习题8-15 P类语言的封闭性327习题8-16 NP类语言的封闭性328习题8-17 语言的2 O (n k) 时间判定算法328习题8-18 P CO -NP329习题8-19 NP≠CO -NP329习题8-20 重言布尔表达式329习题8-21 关系∝ p的传递性329习题8-22 L ∝ p 330习题8-23 语言的完全性330习题8-24 的CO-NP完全性330习题8-25 判定重言式的CO-NP完全性331习题8-26 析取范式的可满足性331习题8-27 2-SAT问题的线性时间算法331习题8-28 整数规划问题332习题8-29 划分问题333习题8-30 最长简单回路问题334第9章近似算法336习题9-1 平面图着色问题的绝对近似算法336习题9-2 最优程序存储问题336习题9-4 树的最优顶点覆盖337习题9-5 顶点覆盖算法的性能比339习题9-6 团的常数性能比近似算法339习题9-9 售货员问题的常数性能比近似算法340习题9-10 瓶颈旅行售货员问题340习题9-11 最优旅行售货员回路不自相交342习题9-14 集合覆盖问题的实例342习题9-16 多机调度问题的近似算法343习题9-17 LPT算法的最坏情况实例345习题9-18 多机调度问题的多项式时间近似算法345算法实现题9-1 旅行售货员问题的近似算法(习题9-9) 346 算法实现题9-2 可满足问题的近似算法(习题9-20) 348算法实现题9-3 最大可满足问题的近似算法(习题9-21) 349 算法实现题9-4 子集和问题的近似算法(习题9-15) 351算法实现题9-5 子集和问题的完全多项式时间近似算法352算法实现题9-6 实现算法greedySetCover(习题9-13) 352算法实现题9-7 装箱问题的近似算法First Fit(习题9-19) 356算法实现题9-8 装箱问题的近似算法Best Fit(习题9-19) 358算法实现题9-9 装箱问题的近似算法First Fit Decreasing(习题9-19) 360算法实现题9-10 装箱问题的近似算法Best Fit Decreasing(习题9-19) 361算法实现题9-11 装箱问题的近似算法Next Fit361第10章算法优化策略365 习题10-1 算法obst的正确性365习题10-2 矩阵连乘问题的 O(n 2) 时间算法365习题10-6 货物储运问题的费用371习题10-7 Garsia算法371算法实现题10-1 货物储运问题(习题10-3) 374算法实现题10-2 石子合并问题(习题10-4) 374算法实现题10-3 最大运输费用货物储运问题(习题10-5) 375算法实现题10-4 五边形问题377算法实现题10-5 区间图最短路问题(习题10-8) 381算法实现题10-6 圆弧区间最短路问题(习题10-9) 381算法实现题10-7 双机调度问题(习题10-10) 382算法实现题10-8 离线最小值问题(习题10-11) 390算法实现题10-9 最近公共祖先问题(习题10-12) 393算法实现题10-10 达尔文芯片问题395算法实现题10-11 多柱Hanoi塔问题397算法实现题10-12 线性时间Huffman算法400算法实现题10-13 单机调度问题402算法实现题10-14 最大费用单机调度问题405算法实现题10-15 飞机加油问题408第11章在线算法设计410习题11-1 在线算法LFU的竞争性410习题11-4 多读写头磁盘问题的在线算法410习题11-6 带权页调度问题410算法实现题11-1 最优页调度问题(习题11-2) 411算法实现题11-2 在线LRU页调度(习题11-3) 414算法实现题11-3 k 服务问题(习题11-5) 416参考文献422。
(算法分析设计)第一章:算法概述
T(N,I)表示算法在一台抽象的计算机上运行需 要的时间。设此抽象计算机的元运算有k种,分别 记为O1,O2,…,OK。每执行一次这些运算所需要的 时间分别为t1,t2,..,tk.设算法用到元运算Oi的次数为 ei(是N和I的函数),则 k
算法实现
设计出复杂性尽 可能低的算法
算法复杂性分析
算法复杂性分析的依赖因素
要解问题的规模——用N表示 算法的输入——用I表示 算法自身——用A表示
C=F(N,I,A)
——C:算法复杂性
时间复杂性函数的具体化?
一个算法的时间复杂度(time complexity)是指算 法运行所需的时间。
培养独立科研能力
初步了解科研工作中解决问题的一般规程。 培养分析问题解决问题的能力。
培养团队合作能力
通过团队完成作业来培养大家的团队合作能力。
为什么要学习算法?
算法不仅是计算机科学的一个分支,它更是计 算机科学的核心,而且,可以毫不夸张地说, 它和绝大多数的科学、商业和技术都是相关 的。——David Harel《算法:计算的灵魂》
n 以上三种情况的复杂性从不同角度来反映算法的效率,各有 其局限性和用处,但操作性最好且最具有实用价值的是最坏 情况下的时间复杂性。
n 如果无特别说明,T(N)=Tmax(N)
算法的效率分析:实例1
问题:已知不重复且已经按从小到大排好的m个整数的数组
A[m],对于给定的整数c,要求寻找一个下标i,使得A[i]=c,
随机算法 数值概率算法 舍伍德算法 拉斯维加斯算法 蒙特卡罗算法
两个基本概念
算法 算法复杂性
算法与程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(7) 复合数据可以组织成由属性或域组成的对象。通过 域名后跟方括号括住的对象名访问某个特定域。
(8) 通过传值将参数传给一个过程。被调用的过程接收 参数的一个复制,如果它对某个参数赋值,则调用过程是看 不到这种变化的。当传递一个对象时,只是拷贝指向对象的 数据的指针,不拷贝它的各个域。
(9) “and”和“or”是布尔运算符。当对表达式“x and y” 求值时,首先计算x的值,如果其值为FALSE,则整个表达 式的值为FALSE,无需再计算y的值;如果x的值为TRUE, 则必须计算y的值,这样才能决定整个表达式的值。类似地, 当对表达式“x or y”求值时,仅当x的值为FALSE时,才需 计算表达式y的值。
·终止:当i>length[A],即i = length[A] +1时,外 层for循环结束。在外循环不变式中,用length[A]+1代替i, 可得子数组A[1..length[A]]。由循环不变式得,子数组 有序,而这个子数组就是整个数组。因此,整个数组有序, 这表明冒泡排序算法是正确的。
1.1.3 伪代码使用约定 在本书的伪代码(pseudocode)中使用以下约定: (1) 缩进形式表示块结构。 (2) while、do-while、for循环结构(语句)以及if-then-else
迭代,在A[i]位置产生当前元素比较范围A[i..n]内的一
个最小值。下标i从数组第一个元素开始,从左向右移动,
直至数组中的最后一个元素。深色阴影部分表示数组元素A
[1..i]构成的已排好的序列,浅色阴影部分表Байду номын сангаас外层循环
开始时的下标i。数组元素A[i+1..n]表示当前正在处理的
序列。
图1-1 冒泡排序工作过程
(10) break语句表示将控制转移到含有break的最内层循 环语句后面的第一条语句。循环语句可以是约定(2)中所列 的那些循环语句。
1.2 算 法 分 析
1.2.1 冒泡排序算法分析 BUBBLE-SORT过程的时间开销与输入有关:1000个元
用性质,这个性质可以用于证明算法的正确性。
下面,我们考察这些性质是如何对冒泡排序成立的。首 先证明内层for循环的不变式。
·循环不变式:A[j]是A[j..length[A]]中的最小元 素。
·初始:在内循环第一次开始迭代之前,j = length [A],因此,子数组A[length[A]..length[A]] 中只 包含一个元素,也即子数组中的最小元素,此时,循环不变 式成立。
·维持:假定在内循环的某次迭代之前循环不变式为真, 即A[j]是A[j..length[A]]中的最小元素。在下一次迭 代之前,若元素A[j]<A[j-1],则执行冒泡算法中的第 4行语句,A[j]与A[j-1] 交换,于是A[j-1]是A[j -1..length[A]]中的最小元素;若A[j]≥A[j-1] ,那么不执行第4行语句,A[j-1]仍然是A[j-1..length [A]]中的最小元素。无论哪一种情况,都能使循环不变 式为真。
条件结构(语句)分别采用类似于高级语言中的相应表示。 (3) 符号“∥”的后面是注释部分。 (4) 多重赋值i←j←e是将表达式e的值赋给变量i和变量j,
这种赋值与i←e和j←e等价。 (5) 变量如i、j和key是给定过程的局部变量。不经显式
说明,不使用全局变量。 (6) 通过数组名后跟索引访问数组元素。
1 for i 1 to length[A]
2
do for j length[A] downto i + 1
3
do if A[j] < A[j – 1]
4
then exchange A[j] A[j – 1]
图1-1说明了输入实例为A =〈5,2,4,6,1,3〉时,
算法BUBBLE-SORT的工作过程。对于外层for循环的每一次
·终止:对于冒泡排序,当j<i+1,即j=i时,内层for循 环结束。在内循环不变式中,用i代替j,可得子数组A [i..length[A]],其中A[i]是最小元素。
其次,证明外层for循环的不变式。 ·循环不变式:在1~4行外层for循环的每次迭代开始时, 子数组A[1..i-1]中的元素有序。 ·初始:在外层for循环的第一次迭代之前,i=1,因此, A[1..0]为空,循环不变式成立。 ·维持:假定在外循环的某次迭代之前循环不变式为真, 即子数组A[1..i-1]中的元素有序。在下一次迭代之前, 由内循环的不变式可得A[i-1]≤A[i]成立,因此,子数 组A[1..i]中的元素有序。
1.1.2 循环不变式和冒泡排序算法的正确性 我们可以利用循环不变式证明算法的正确性。循环不变
式具有以下三个性质: ·初始(initialization):在循环的第一次迭代之前,循环
不变式为真。 ·维持(maintenance):如果在循环的某次迭代之前循环
不变式为真,那么在下一次迭代之前,循环不变式仍然为真。 ·终止(termination):当循环终止时,循环不变式给出有
1.1.1 冒泡排序 冒泡排序(bubble sort)属于基于交换思想的排序方法。
它将相邻的两个元素加以比较,若左边元素值大于右边元素 值,则将这两个元素交换;若左边元素值小于等于右边元素 值,则这两个元素位置不变。右边元素继续和下一个元素进 行比较,重复这个过程,直到比较到最后一个元素为止。
冒泡排序的伪代码用过程BUBBLE-SORT表示,其参数 为包含n个待排序数的数组A[1..n]。当过程BUBBLESORT结束时,数组A中包含已排序的序列。
第1章 算法基础
1.1 算法 1.2 算法分析 1.3 算法的运行时间 习题
1.1 算 法
算法(algorithm)可以被定义为一个良定的计算过程,它 具有一个或者若干输入值,并产生一个或者若干输出值。因 此,算法是由将输入转换成输出的计算步骤所组成的序列。
也可将算法看做是解决良定计算问题的工具。人们采用 一般术语陈述问题,确定输入/输出关系,而算法则是描述 这种输入/输出关系的特定计算过程。