算法设计与分析(清华第二版,王晓东)
算法设计与分析王晓东

习题2-1 求下列函数的渐进表达式:3n^2+10n; n^2/10+2n; 21+1/n; logn^3; 10 log3^n 。
解答:3n^2+10n=O(n^2),n^2/10+2^n=O(2^n),21+1/n=O(1),logn^3=O(logn),10log3^n=O(n).习题2-3 照渐进阶从低到高的顺序排列以下表达式:n!,4n^2,logn,3^n,20n,2,n^2/3。
解答:照渐进阶从高到低的顺序为:n!、3^n、4n^2 、20n、n^2/3、logn、2习题2-4(1)假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。
在某台计算机上实现并完成该算法的时间为t秒。
现有另外一台计算机,其运行速度为第一台计算机的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(2)若上述算法的计算时间改进为T(n)=n^2,其余条件不变,则在新机器上用t秒时间能解输入规模多大的问题?(3)若上述算法的计算时间进一步改进为,其余条件不变,那么在新机器上用t秒时间能解输入规模多大的问题?解答:(1)设能解输入规模为n1的问题,则t=3*2^n=3*2^n/64,解得n1=n+6(2)n1^2=64n^2得到n1=8n(3)由于T(n)=常数,因此算法可解任意规模的问题。
习题2-5 XYZ公司宣称他们最新研制的微处理器运行速度为其竞争对手ABC公司同类产品的100倍。
对于计算复杂性分别为n,n^2,n^3和n!的各算法,若用ABC公司的计算机能在1小时内能解输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的问题?解答:n'=100nn'^2=100n^2得到n'=10nn'^3=100n^3得到n'=4.64nn'!=100n!得到n'<n+log100=n+6.64习题2-6对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
计算机算法设计与分析【王晓东-电子工业出版社-2版】-第3章

总共有五中完全加括号的方式
( A((BC)D)) ( A(B(CD))) (( AB)(CD))
((( AB)C)D) (( A(BC))D)
16000, 10500, 36000, 87500, 34500
上海金融学院信息管理系
T(n)
=n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
上海金融学院信息管理系
5
算法总体思想
如果能够保存已解决的子问题的答案,而在需 要时再找出已求得的答案,就可以避免大量重 复计算,从而得到多项式时间算法。
第3章 动态规划
1
学习要点:
理解动态规划算法的概念。 掌握动态规划算法的基本要素 (1)最优子结构性质 (2)重叠子问题性质 掌握设计动态规划算法的步骤。 (1)找出最优解的性质,并刻划其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式计算出最优值。 (4)根据计算最优值时得到的信息,构造最优解。
上海金融学院信息管理系
9
矩阵连乘问题
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1, 2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次 序计算矩阵连乘积需要的数乘次数最少。
穷举法:列举出所有可能的计算次序,并计算出每一种计 算次序相应需要的数乘次数,从中找出一种数乘次数最少的 计算次序。
上海金融学院信息管理系
2
• 通过应用范例学习动态规划算法设计策略。 • (1)矩阵连乘问题; • (2)最长公共子序列; • (3)最大子段和 • (4)凸多边形最优三角剖分; • (5)多边形游戏; • (6)图像压缩; • (7)电路布线; • (8)流水作业调度; • (9)背包问题; • (10)最优二叉搜索树。
算法设计与分析第1章2015

4. if i < n return i
T(n) :算法的运行时间 问题规模n的函数
输入分布:最坏情况、 最好情况、平均情况
Tmax(n), Tmin(n), Tavg(n)
算法运行时间
假设每条语句的执行 时间均为单位时间。
=
全部语句的执行时间之和
算法运行中主要影响运行 时间的语句是基本操作, 即占有最多比例的语句。
算法设计
丘奇-图灵论点:凡是可计算的函数都是一般递归函数 (或图灵机可计算函数) • 凡是可以从某些初始符号开始,而在有 限步骤内计算的函数都是递归函数。 • 计算机只能计算一般递归函数。 • 算法设计就是根据某个算法设计策略写 出递归函数或递归算法。
算法的描述方法
• 可以用自然语言、伪代码(pseudocode)或计 算机程序语言来描述算法,必须精确地描 述计算过程。
算法设计与分析
Algorithm Design And Analysis
东北大学 信息学院 计算机应用技术研究所 郭楠
2015版
教学目标及内容
• 教学内容
– 王晓东,《计算机算法设计与分析》,1~6章
• 教学目标
– 通过对典型算法的分类介绍,掌握算法设计的主要策 略以及对算法性能正确分析的能力。 策略 算法设计
– 用有限的指令和有限的存储空间可算尽一切可算之物 – 凡是可计算的过程都可用图灵机实现 – 机器能思考吗?
程序 内部状态
纸带
Here is an implementation of a Turing machine
控制器
一台图灵机是一个七元组M = (Q, Σ, Γ, Δ, q0, B, F)
– – – – Q是内部状态的有穷集合; Σ是输入符号集,其中不包含特殊的空白符; Γ是允许使用的纸带符号的有穷集合; Δ是转移函数(即程序),根据当前状态及当前输入 符号确定下一状态及读写头的动作,包括对输入符 号的运算以及读写头的移动(左移L或右移R);
《算法分析与设计》说课

8
8
8
10
S4
贪心算法
6
6
S5
回溯法
6
8
S6
分支限界
6
8
S7
随机化算法 总学时数
4 40
6 48
说课程教学大纲
5、课外学习内容 分支 限界 算法 设计 分治 分治 最强大脑—数独 阶乘 递归 兔子问题 会场安排问题 国王分财产
银行最优服务次序
回溯 法 贪心 贪心 算法 算法
矩阵连乘 租用游艇 排序问题
•难点模块
分治策略
动态规划 贪心算法
•难点内容
分治策略的应用
分解最优解结构 构造递归关系
回溯法
分支限界法
判断是否满足贪心性质
回溯法--剪枝函数 解空间树
说课导航
说课程教学大纲
说教学资源 说教学方法与手段 说学情与学法指导 说教学过程设计
说考核评价
说教学资源
1、教材选用原则
国家级规划教材 原则
具有先进性、适用性、时效性
汽车加油行驶 网球循环赛比赛日程
动态 规划
充分体现案例驱动、实践导向的设计思想
说课程教学大纲
6、课程重点
•重点模块
递归与分治策略
动态规划算法 贪心算法
•重点内容
二分搜索与排序
矩阵连乘 最长公共子序列
回溯法
分支限界法
最大字段和
0-
说课程教学大纲
7、课程难点
经典教材
说教学资源
王晓东教授编著的 《计算机算法设计与分析》 (C++描述)
说教学资源
2、网络资源
课外学习网站:
/JudgeOnline/problemtypelist.php
计算机算法设计与分析(王晓东) 第5章 回溯法

n=3时的0-1背包问题用完全二叉树表示的解空间
5
生成问题状态的基本方法
扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成的节点称 做活结点 死结点:一个所有儿子已经产生的结点称做死结点 深度优先的问题状态生成法:如果对一个扩展结点R,一旦 产生了它的一个儿子C,就把C当做新的扩展结点。在完成 对子树C(以C为根的子树)的穷尽搜索之后,将R重新变 成扩展结点,继续生成R的下一个儿子(如果存在) 宽度优先的问题状态生成法:在一个扩展结点变成死结点 之前,它一直是扩展结点 回溯法:为了避免生成那些不可能产生最佳解的问题状态, 要不断地利用限界函数(bounding function)来处死那些实际 上不可能产生所需解的活结点,以减少问题的计算量。具 有限界函数的深度优先生成法称为回溯法
}
18
n后问题
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象 棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线 上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任 何2个皇后不放在同一行或同一列或同一斜线上。
1 2 3 4 5 6 7 8 Q Q Q Q Q Q Q
void backtrack (int i) {// 搜索第i层结点 if (i > n) // 到达叶结点 更新最优解bestx,bestw; return; r -= w[i]; if (cw + w[i] <= c) {// 搜索左子树 x[i] = 1; cw += w[i]; backtrack(i + 1); cw -= w[i]; } if (cw + r > bestw) { x[i] = 0; // 搜索右子树 backtrack(i + 1); } r += w[i];
《计算机算法设计与分析》第二版王晓东“最大m字段和优化函数”——P57注释

《计算机算法设计与分析》第二版王晓东“最大m字段和优化函数”——P57注释之所以想到要注释一下,没别的意思,只是因为几个月前刚学DP,完全看不懂,前几天费了几个小时终于看懂了,注释下来,能使自己整理一下思路,也作为自己的一篇日记。
当时我能看懂时间和空间均为O(MN^2)的函数,但可能由于自己看书是直接从动态规划一章看起,书上对于经过优化的函数也没有更多的解析,当时看起来完全不知所云。
前几天看的时候,是对着方程结合书上的几句话自己去理解,尝试自己动手去写,但错了。
看书上代码,都要自己去理解那些变量数组是干什么用的,感觉也是非常吃力。
1,我觉得理解那个优化函数,必须先要充分理解那个二维的DP方程:b[i][j]=max(b[i][j-1]+a[j],max(b[i-1][t])+a[j]) (i-1<=t<j)b[i][j]表示的是第i段在前j项(含第j项)的最大值。
对于b[i][j]含有第j项必须要理解好!则方程的意思是:对于a[j]项,要么将它加到第i段,要么它自己作为新的一段。
注意到方程外层的max选择,都要加上a[j]这一项。
这里可能很容易产生一个疑问,如果a[j]是一个负数,为什么还要加上a[j]呢?回到b[i][j]所表示的意义上解释,由于b[i][j]表示的是含有第j项的最大值,所以a[j]是肯定要加进来的。
假使a[j]是一个负数,它加进来了也不会影响在第i段中前j-1项的最大值。
所以第m段的最大值,并不是b[m][n],而是b[m][m~n]之间的最大值。
同样道理,第i-1段的最大值是b[i-1][t],(i-i<=t<j)。
2,理解了上述的DP方程后,再来考虑优化,正如书上所说的,由于在第i段中,只用到第i段和第i-1段的值。
如果采用一维数组存储b[],只要在计算第i段的时候,没有去改变第i-1段保留下来的值即可。
再考虑到,内层max选择,需要用到第i-1段在i-1到j-1位置的最大值,不但要进行重复计算,也影响到b[j]的计算,因为j前面的值既要用作b[j]的计算,也要更新作为下一段i+1计算时所用。
算法设计与分析.ppt
教学计划
1 导引和基本数据结构 2 分治法 4学时 3 贪心方法 4学时 4 动态规划 4学时 5 基本检索与周游方法 6 回溯法 4学时 7 分枝界限法 4学时 2学时
4学时
第 1章
绪论
算法理论的两大论题:
1. 算法设计
2. 算法分析
1.1 算法
1. 为什么要学习算法
2. 算法及其重要特性
3. 算法的描述方法
⑸ 可行性(Effectiveness) :算法描述的操作可以通过已 经实现的基本操作执行有限次来实现。
好算法的特征
(1) 正确 算法必须满足问题的要求,即对合 法的输入能产生求解问题的正确结果;对不合 法的输入能作出相适应的反映并进行处理。 (2) 可读 能交流,它有助于人们对算法的 理解、调试和修改。 (3) 运行时间短。 (4) 占用内存尽量少。
4. 算法设计的一般过程
5. 重要的问题类型
1. 为什么要学习算法
理由1:算法——程序的灵魂
问题的求解过程:
分析问题→设计算法→编写程序→整理结果
程序设计研究的四个层次:
算法→方法学→语言→工具
理由2:提高分析问题的能力
算法的形式化→思维的逻辑性、条理性
2. 算法及其重要特性
算法(Algorithm):对特定问题求解
算法设计的原则
1.正确性——合理的数据输入下,在有限的运行 时间内得出正确的结果。 2. 可读性——供人们阅读的方便程度。 3.健壮性——对不合理的数据输入的反应和处理 能力。 4.简单性——采用数据结构和方法的简单程度。 5. 时间复杂度(计算复杂度)——算法运行时间的 相对量度。 6. 空间复杂度——算法运行中临时占用空间大小 的量度。
算法分析课件 王晓东 第二版
分治法的设计思想是,将一个难以直接解决的大问题, n = T(n) 分割成一些规模较小的相同问题,以便各个击破, 分而治之。 凡治众如治寡,分数是也。 n/2 n/2 n/2 ----孙子兵法 n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
T(n)
n/2
=
n/2
n
n/2 n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4)
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问题 的解,自底向上逐步求出原来问题的解。
public static void T (n) 2T (n / 2) O(n) n a[], int left, int right) mergeSort(Comparable 1
}
合并排序
算法mergeSort的递归过程可以消去。
初始序列
[49] [38] [65] [97] [76] [13] [27]
每执行一次算法的 while循环, 待搜索数 组的大小减少一半。因 此,在最坏情况下, while循环被执行了 O(logn) 次。循环体内 运算需要O(1) 时间, 因此整个算法在最坏情 况下的计算时间复杂性 为O(logn) 。
思考题:给定a,用二分法设计出求an的算法。
合并排序
基本思想:将待排序元素分成大小大致相同的2个子集合,分 别对2个子集合进行排序,最终将排好序的子集合合并成为所 要求的排好序的集合。 复杂度分析 O(1) n 1 { T(n)=O(nlogn) 渐进意义下的最优算法 if (left<right) {//至少有2个元素 int i=(left+right)/2; //取中点 mergeSort(a, left, i); mergeSort(a, i+1, right); merge(a, b, left, i, right); //合并到数组b copy(a, b, left, right); //复制回数组a }
《算法设计与分析》实验大纲
《算法设计与分析》实验教学大纲实验学时:32 实验个数:7 实验学分:1课程性质:适用专业:计算机科学与技术、软件工程教材及参考书:1.《计算机算法设计与分析》,王晓东,北京:电子工业出版社,2005年2.《算法与数据结构》,傅清祥等著,北京:电子工业出版社,20033.《计算机算法导引—设计与分析》,卢开澄著,北京:清华大学出版社,2001 大纲执笔人:刘芳大纲审定人:郭涛一、实验课的性质与任务算法的设计与分析是计算机科学的核心问题之一,也是计算机科学与技术专业本科及研究生的一门重要的专业基础课,其内容是研究计算机领域及其有关领域中的一些非数值计算的常用算法。
课程将覆盖计算机软件实现中常用的、有代表性的算法,并具有一定的深度和广度,通过实验,使学生理解并掌握算法设计的基本技术,让学生具有针对所给的问题设计和实现高效算法的基本能力。
二、实验课程目的与要求计算机科学的一个核心问题是算法理论,本课程介绍非数值算法设计的策略与技术,同时介绍算法的复杂性的概念通过对一些代表性算法的使用达到了解掌握与运用的目的。
通过完成课程实验,使学生达到如下要求:1.熟悉各种基本常用算法的基本思想、适用范围,初步掌握算法分析的基本技巧以及如何根据实际问题设计一个有效的算法。
2.能对给定问题分析出恰当的数学模型,并设计出解决方案,将算法用高级语言(C,VC++等)编程实现。
三、实验内容安排:实验一算法设计基础(验证型、设计型实验4学时)1.实验目的(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
2.实验要求(1)认真填写实验报告,附加源代码(主要代码)和运行记录;(2)对设计好的算法,测试运行实验数据,检查输出是否正确。
并对算法的时间和空间复杂度进行分析。
3.实验内容:(1)统计数字问题(P8)#include "stdafx.h"#include <iostream>#include <conio.h>#include <string>using namespace std;void read_information(string &Data){//从文件中读出停车场信息,并且存放在数组中cout<<"正在读取数据......"<<endl;FILE *fp;char ch;if((fp=fopen("data.txt","rt+"))==NULL){printf("\nCannot open file strike any key exit!");getch();exit(1);}ch=fgetc(fp);while(ch!=EOF){Data = Data + ch;ch=fgetc(fp);}fclose(fp);cout<<"读取完成......"<<endl;}void save_information(string data){//把数组中的停车场信息存放回文件中cout<<"正在写入文件......"<<endl;FILE *fp;//定义文件流指针,用于打开写操作的文件char ch[2]="\0";//定义一个字符串数组,用于存储读取的字符int i=0;fp = fopen("answer.txt","w");//写方式打开文件a.txtwhile(i < data.length())//逐行读取fp1所指向文件中的内容到text中{ch[0] = data[i++];fputs(ch,fp);//将内容写到fp2所指向文件中}fclose(fp);//关闭文件b.txtcout<<"写入完成......"<<endl;}int main(int argc, char* argv[]){int Page;int Num[10] = {0,0,0,0,0,0,0,0,0,0};string Data;int jishu = 0;read_information(Data);Page = atoi(Data.c_str());cout<<"计算中.\n"<<jishu<<"%"<<endl;;for(int i=1; i<=Page; i++){char sz[10];itoa(i, sz, 10);for(int j=0; sz[j]!='\0'; j++){Num[sz[j]-48]++;}if((int)i/Page*100>jishu){jishu = i/Page*100;cout<<jishu<<"%"<<endl;}}cout<<endl;string answer = "";for (i=0; i<10; i++){char tmp[10];char sz[2];itoa(Num[i], tmp, 10);itoa(i, sz, 10);answer = answer + sz[0];answer = answer + ":";for(int j=0; j<10 && tmp[j]!='\0'; j++){answer = answer + tmp[j];}answer = answer + '\n';}save_information(answer);system("pause");return 0;}字典序问题(P8)(2)最多约数问题(P9)#include "stdafx.h"#include <iostream>#include <string>using namespace std;int yueshuNum(int x){int num = 0;for(int i=1; i<=x; i++){if(x%i == 0){num++;}}return num;}void read_information(string &Data){//从文件中读出停车场信息,并且存放在数组中cout<<"正在读取数据......"<<endl;FILE *fp;char ch;if((fp=fopen("data.txt","rt+"))==NULL){printf("\nCannot open file strike any key exit!");exit(1);}ch=fgetc(fp);while(ch!=EOF){Data = Data + ch;ch=fgetc(fp);}fclose(fp);cout<<"读取完成......"<<endl;}void save_information(string data){//把数组中的停车场信息存放回文件中cout<<"正在写入文件......"<<endl;FILE *fp;//定义文件流指针,用于打开写操作的文件char ch[2]="\0";//定义一个字符串数组,用于存储读取的字符int i=0;fp = fopen("answer.txt","w");//写方式打开文件a.txtwhile(i < data.length())//逐行读取fp1所指向文件中的内容到text中{ch[0] = data[i++];fputs(ch,fp);//将内容写到fp2所指向文件中}fclose(fp);//关闭文件b.txtcout<<"写入完成......"<<endl;}int main(int argc, char* argv[]){int start, end;int Num=0, flag = 1;string data;read_information(data);char tmpstart[10];char tmpend[10];for(int j=0; data[j]!='\0';j++){if(data[j] == ' '){flag = j + 1;}else if(flag == 1){tmpstart[j] = data[j];}else{tmpend[j-flag] = data[j];}}start = atoi(tmpstart);end = atoi(tmpend);for(int i=start; i<=end; i++){int num = yueshuNum(i);if(num > Num){Num = num;}}char answerchar[10];string answer = "";itoa(Num, answerchar, 10);for(i=0; i<10 && answerchar[i]!='\0'; i++){answer = answer + answerchar[i];}save_information(answer);return 0;}(3)最大间隙问题(P10)(4)设计算法求解fibonacci数列的第110项的值,并统计和分析算法的时间性能。
算法设计与分析(第2版)
作者简介
王晓东,男,1957年3月出生,福州大学计算机系教授,福建省计算机学会理事长。研究领域是算法设计与 算法评价,基于计算机络和信息安全的大规模问题求解算法与数据结构,信息可视化技术。几何计算,并行和分 布式算法设计,计算复杂性理论。先后主持了与算法设计与分析有关的国家自一然科学基金项目、国家优秀留学 回国人一员基金项目、福建省杰出人才基金项目和省自然科学基金项目等7个研究课题;获得国家科技进步二等奖 1项,省科技进步二等奖3项。主持国家精品课程“算法与数据结构”,和福建省优质硕士学位课程“算法设计与 分析”的课程建设,获2005年福建省教学成果一等奖。在国内外重要学术刊物上发表有创见性的论文50余篇;正 式出版《算法设计与分析》等学术著作7部,在算法复杂性研究方面取得了一系列理论研究成果和应用成果。例如, 在对著名的凸壳问题的计算复杂性研究成果中推广了关于判定树模型下问题的计算复杂性下界的著名的Ben-Or, 并应用于分析凸壳问题的计算复杂性,在较_般的情况下改进和完善了国际算法界知名学者Aggarwal、Steele和 Yao等提出的关于凸壳问题计算复杂性下界的结果。研究成果得到同行专家的好评并被国内权威刊物所引用。
内容提要
为了适应培养我国21世纪计算机各类人才的需要,结合我国高等学校教育工作的现状,立足培养学生能跟上 国际计算机科学技术的发展水平,更新教学内容和教学方法,提高教学质量,本书以算法设计策略为知识单元, 系统地介绍计算机算法的设计方法与分析技巧,以期为计算机科学与技术学科的Байду номын сангаас生提供广泛而坚实的计算机算 法基础知识。
目录
第1章算法引论 1.1算法与程序 1.2表达算法的抽象机制 1.3描述算法 1.4算法复杂性分析 小结 习题 第2章递归与分治策略 2.1递归的概念 2.2分治法的基本思想 2.3二分搜索技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
清华大学出版社
算法设计与分析
(2)tk≠tj:此时要找出t1 … tj-1的后缀中第2大真前缀,显然, 这个第2大的真前缀就是next[next[j]]=next[k]。
t1 … tnext[k]-1 tnext[k] … tk-1 tk … tj-next[k]+1 … tj-1 tj tj+1
1 n n 1 pici n (n i 1) 2 O(n) i 1 i 1
n
数量级相同, 系数相差一半
清华大学出版社
算法设计与分析
一般观点:
用蛮力法设计的算法,一般来说,经过适度的 努力后,都可以对算法的第一个版本进行一定程度 的改良,改进其时间性能,但只能减少系数,而数 量级不会改变。
∵t1=t5, t1t2t3=t3t4t5 ∴a和aba都是ababa的真前缀和真后缀, 但aba的长度最大 ∴next[6]=3+1=4 即当t6和si匹配失败后,将t4和si进行比较
t1 t2 t3 t4 t5 t6
ababac
真前缀 真后缀
next[j]函数表征着模式T中最大相同首子串和尾子串(真 子串)的长度。可见,模式中相似部分越多,则next[j]函数越 大,模式串向右滑动得越远,与主串进行比较的次数越少,时 间复杂度就越低。
清华大学出版社
算法设计与分析
i
i
i
第 趟
a a
j
b b
j
a c
j
b c a
b c a
c b
a
b
第 趟
1 2
i=3,j=3失败;
i
a
b a
j
a
b
c a
b
c a
c b
a
b
s2=t2;t1≠t2 ∴t1≠s2
清华大学出版社 i
算法设计与分析
i
i i
i
第 趟
a b a b c a b c a c b a
j j j j j j
i=11 , j=6 , t 中 全 部 字符都比较完毕,匹 配成功。
清华大学出版社
算法设计与分析
算 法
int BF(char S[ ], char T[ ]) { i=1; j=1; while (i<=S[0] && j<=T[0] ) { if (S[i]==T[j]) {i++; j++;} else {i=i-j+2; j=1; } } if (j>T[0]) return (i-j+1); else return 0; }
n m 1
1 m(n m 2) (i m) pi (i m) 2 i 1 i 1 n m 1
n m 1
清华大学出版社
算法设计与分析
改进的串匹配算法——KMP算法
设计思想:尽量利用已经部分匹配的结果信息, 尽量让主串 i 不回溯,加快模式串的滑动速度。
(1)设模式滑动到第k个字符,则T1~Tk-1 =Si-(k-1) ~ Si-1
S="a b a b c a b c a c b a b" T="a b c a c"
k j
(2)则Tj-(k-1) ~ Tj-1 =Si-(k-1) ~ Si-1
两式联立可得:T1~Tk-1=Tj-(k-1) ~Tj-1
第 趟
i
i
4
a b a b c a b c a c b a
a
jj
i i
b
i=4,j=1失败 i回溯到5,j回溯到1
第 趟
a b a b c a b c a c b a
a
jj
b
5
i=5,j=1失败 i回溯到6,j回溯到1
清华大学出版社
算法设计与分析
第 趟
i
i
i
i i
i
6
a b a b c a b c a c b a b a b c a c
动的新比较起点k?
②模式应该向右滑多远才是最高效率的?
清华大学出版社
算法设计与分析
i
请抓住部分匹配时的两个特征:
i
S="a b a b c a b c a c b a b" S="a b a b c a b c a c b a b" T="a b c a c" T="a b c a c"
k j k i
清华大学出版社
算法设计与分析
T1…Tk-1=Tj-(k-1) …Tj-1说明了什么? (1) k 与 j 具有函数关系,由当前失配位置 j , 可以计算出滑动位置 k(即比较的新起点); (2)滑动位置k 仅与模式串T有关。
T1…Tk-1=Tj-(k-1) …Tj-1的物理意义是什么?
从第1位往右 经过k-1位 从j-1位往左 经过k-1位
清华大学出版社
算法设计与分析
第3章 蛮力法
3.1 蛮力法的设计思想 3.2 查找问题中的蛮力法
3.3 排序问题中的蛮力法
3.4 组合问题中的蛮力法 3.5 图问题中的蛮力法 3.6 几何问题中的蛮力法 3.7 实验项目——串匹配问题
清华大学出版社
算法设计与分析
3.1 蛮力法的设计思想
蛮力法的设计思想:直接基于问题的描述。
例:计算an
an=a×a×…×a
n次
清华大学出版社
算法设计与分析
蛮力法所赖的基本技术——扫描技 术
关键——依次处理所有元素 基本的扫描技术——遍历
(1)集合的遍历 (2)线性表的遍历
(3)树的遍历
(4)图的遍历
清华大学出版社
算法设计与分析
虽然巧妙和高效的算法很少来自于蛮力法,基于 以下原因,蛮力法也是一种重要的算法设计技术:
清华大学出版社
算法设计与分析
本趟匹配开始位置 回溯 主串S
i
si
…
模式T
……
tj
回溯
j
清华大学出版社
算法设计与分析
设主串s=“ababcabcacbab”,模式t=“abcac
i ii i
第 趟
a b
a
jj
a
c
j
b c a
b c
a
c b
a
b
1
b
j
i=3,j=3失败; i回溯到2,j回溯到1
清华大学出版社
BF C++
清华大学出版社
算法设计与分析
设串S长度为n,串T长度为m,在匹配成功的情况下, 考虑最坏情况,即每趟不成功的匹配都发生在串T的最后一 个字符。 例如:S="aaaaaaaaaaab" T="aaab" 设匹配成功发生在si处,则在i-1趟不成功的匹配中共 比较了(i-1)×m次,第i趟成功的匹配共比较了m次,所 以总共比较了i×m次,因此平均比较次数是:
基本语句 ?
算法3.1的基本语句是i>0和r[i]!=k,其执行次数为:
1 n 1 n pibi pici n (n i 1) n (n i 1) n 1 O(n) i 1 i 1 i 1 i 1
n
n
清华大学出版社
算法设计与分析
改进的顺序查找
a b c a c
j i j j j j
b
3
i=7,j=5失败
第 趟
4
a b a b c a b c a c b a a
j
b
s4=t2;t1≠t2 ∴t1≠s4
清华大学出版社 i
算法设计与分析
第 趟
a b a b c a b c a c b a b a
j i i
第 趟
i=11,j=6,t中全部字符 都比较完毕,匹配成功。
3.2 查找问题中的蛮力法
3.2.1 顺序查找
3.2.2 串匹配问题
清华大学出版社
算法设计与分析
3.2.1 顺序查找
顺序查找从表的一端向另一端逐个将元素与给பைடு நூலகம்值进行 比较,若相等,则查找成功,给出该元素在表中的位置;若 整个表检测完仍未找到与给定值相等的元素,则查找失败, 给出失败信息。
0 1 2 3 24 4 5 6 7 8 9 55 i
t1 … tnext[k]-1 tnext[k] … tk-1 tk … tj-next[k]+1 … tj-1 tj tj+1
最2大真前缀 最2大真后缀
清华大学出版社
算法设计与分析
例如,模式T="a b a a b a b c"的next值计算如下:
清华大学出版社
算法设计与分析
3.2.2 串匹配问题
串匹配问题——给定两个串S=“s1s2…sn” 和T=“t1t2…tm”,在 主串S中查找子串T的过程称为串匹配,也称模式匹配。
串匹配问题属于易解问题。 串匹配问题的特征:
(1)算法的一次执行时间不容忽视:问题规模 n 很大, 常常需要在大量信息中进行匹配;
算法设计与分析
第 趟
i
i
a b a b c a b c a c b a b
a
jj i
2 3
i=2,j=1失败 i回溯到3,j回溯到1
ii
i i i
第 趟
a b a b c a b c a c b a
a b c a c
jj j j j j
b
i=7,j=5失败 i回溯到4,j回溯到1
清华大学出版社
算法设计与分析
10 15
6 12 35 查找方向