第3章 蛮力法资料
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 蛮力法
3.1 概述 3.2 查找问题中的蛮力法 3.3 排序问题中的蛮力法 3.4 组合问题中的蛮力法 3.5 图问题中的蛮力法 3.6 几何问题中的蛮力法
2020/9/10
算法设计与分析--蛮力法
1
3.1 概述
3.1.1 蛮力法的设计思想
蛮力法(穷举法),是一种简单而直接地解决问题的方 法。设计思想:直接基于问题的描述。
index=i; for (j=i+1; j<=n; j++) //在无序区中找最小记录 if (r[j]<r[index]) index=j; if (index!=i) r[i]←→r[index]; //若最小记录不在最终位置则交换 } }
例:计算an
an=a×a×…×a n次
2020/9/10
算法设计与分析--蛮力法
2
应用实例: 计算an的值是RSA算法的主要组成 部分。 RSA算法的加密和解密过程都需要一 个整数的整数次幂再取模。
例如,设公钥为(5,119),私钥为(77,119),明 文m=19,则加密得密文c为:
c=195 mod 119=2 476 099 mod 119=66 解密得明文m为: m=6677 mod 119=19 计算an算法的效率直接影响到RSA算法的性能。
(2)蛮力法经常用来解决一些较小规模的问 题。
(3)对于一些重要的问题(如:排序、查找) 蛮力法可以产生一些合理的算法。
(4)蛮力法可以作为某类问题时间性能的底 限,来衡量同样问题的更高效算法。
2020/9/10
算法设计与分析--蛮力法
5
举例:百元买百鸡问题
已知公鸡5元一只,母鸡3元一只,小 鸡1元三只,用100元钱买100只鸡,问公鸡、 母鸡、小鸡各多少只?
2020/9/10
算法设计与分析--蛮力法
13
3.3 排序问题中的蛮力法
排序:给定一个记录序列(r1,r2,…,rn),其相应的 关键字分别为(k1,k2,…,kn) ,排序是将这些记录 排列成顺序为(rs1,rs2,…,rsn)的一个序列,使得相 应的关键字满足ks1ks2 … ksn(升序或非降序)或 ks1 ks2 … ksn (降序或非升序) 。
2020/9/10
算法设计与分析--蛮力法
6
3.2 查找问题中的蛮力法
3.2.1 顺序查找 3.2.2 串匹配问题
2020/9/10
算法设计与分析--蛮力法
7
3.2.1 顺序查找
顺序查找从表的一端向另一端逐个将元素与给
定值进行比较,若相等,则查找成功,给出该元素 在表中的位置;若整个表检测完仍未找到与给定值 相等的元素,则查找失败,给出失败信息。
0 1 23 456 7 8 9 10 15 24 6 12 35 40 98 55
查找方向
i
2020/9/10
算法设计与分析--蛮力法
8
算法3.1——顺序查找
int SeqSearch1(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合
{ i=n;
基本语句 ?
有序区 已经位于最终位置
无序区 rmin为无序区的最小记录
2020/9/10
算法设计与分析--蛮力法
15
算法3.6——选择排序
void SelectSort(int r[ ], int n) //数组下标从1开始 {
for (i=1; i<=n-1; i++) //对n个记录进行n-1趟简单选择排序 {
10
算法3.2——改进的顺序查找
int SeqSearch2(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合 { r[0]=k; i=n; while (r[i]!=k)
i --; return i; }
算法3.2的基本语句是r[i]!=k,其执行次数为: 数量级相同,
3.3.1 选择排序
3.3.2 起泡排序
2020/9/10
算法设计与分析--蛮力法
14
3.3.1 选择排序
选择排序第i趟排序从第i个记录开始扫描序列, 在n-i+1(1≤i≤n-1)个记录中找到关键码最小的记 录,并和第i个记录交换作为有序序列的第i个记录。
交换
r1 ≤r2 … … ≤ri-1 ri ri+1 … rmin … rn
系数相差一半
n
i 1
pici
1 n
n i 1
(n i
1)
n 1 2
O(n)
2020/9/10
算法设计与分析--蛮力法
11
❖ 一般观点: 用蛮力法设计的算法,都可以对算法的
第一个版本进行一定程度的改良,改进其时 间性能,但只能减少系数,而数量级不会改 变。
2020/9/10
算法设计与分析--蛮力法
while (i>0 && r[i]!=k)
i--;
return i;
}
算法3.1的基本语句是i>0和r[i]!=k,其执行次数为:
n
i 1
pibi
n i 1
pici
1 n
n i 1
(n
i
1)
1 n
n i 1
(n
i
1)
n
1
O(n)
其中pi是第i个元素的查找概率,而bi和ci分别是基本语句 i>0和r[i]!=k的执行次数
2020/9/10
算法设计与分析--蛮力法
9
wk.baidu.com
改进的顺序查找
将待查值放在查找方向的尽头处,免去了在查找过 程中每一次比较后都要判断查找位置是否越界,从 而提高了查找速度。
哨兵
0123456789 k 10 15 24 6 12 35 40 98 55
查找方向
i
2020/9/10
算法设计与分析--蛮力法
2020/9/10
算法设计与分析--蛮力法
3
蛮力法所依赖的基本技术——扫描技术
关键——依次处理所有元素
基本的扫描技术——遍历 (1)集合的遍历 (2)线性表的遍历 (3)树的遍历 (4)图的遍历
2020/9/10
算法设计与分析--蛮力法
4
蛮力法也是一种重要的算法设计技术,原因如下:
(1)理论上,蛮力法可以解决可计算领域的各 种问题。
12
3.2.2 串匹配问题 (略)
串匹配问题——给定两个串S=“s1s2…sn” 和T=“t1t2…tm”,在 主串S中查找子串T的过程称为串匹配,也称模式匹配。
➢ 串匹配问题属于易解问题。 ➢ 串匹配问题的特征:
(1)算法的一次执行时间不容忽视:问题规模 n 很大, 常常需要在大量信息中进行匹配; (2)算法改进所取得的积累效益不容忽视:串匹配操作 经常被调用,执行频率高。
3.1 概述 3.2 查找问题中的蛮力法 3.3 排序问题中的蛮力法 3.4 组合问题中的蛮力法 3.5 图问题中的蛮力法 3.6 几何问题中的蛮力法
2020/9/10
算法设计与分析--蛮力法
1
3.1 概述
3.1.1 蛮力法的设计思想
蛮力法(穷举法),是一种简单而直接地解决问题的方 法。设计思想:直接基于问题的描述。
index=i; for (j=i+1; j<=n; j++) //在无序区中找最小记录 if (r[j]<r[index]) index=j; if (index!=i) r[i]←→r[index]; //若最小记录不在最终位置则交换 } }
例:计算an
an=a×a×…×a n次
2020/9/10
算法设计与分析--蛮力法
2
应用实例: 计算an的值是RSA算法的主要组成 部分。 RSA算法的加密和解密过程都需要一 个整数的整数次幂再取模。
例如,设公钥为(5,119),私钥为(77,119),明 文m=19,则加密得密文c为:
c=195 mod 119=2 476 099 mod 119=66 解密得明文m为: m=6677 mod 119=19 计算an算法的效率直接影响到RSA算法的性能。
(2)蛮力法经常用来解决一些较小规模的问 题。
(3)对于一些重要的问题(如:排序、查找) 蛮力法可以产生一些合理的算法。
(4)蛮力法可以作为某类问题时间性能的底 限,来衡量同样问题的更高效算法。
2020/9/10
算法设计与分析--蛮力法
5
举例:百元买百鸡问题
已知公鸡5元一只,母鸡3元一只,小 鸡1元三只,用100元钱买100只鸡,问公鸡、 母鸡、小鸡各多少只?
2020/9/10
算法设计与分析--蛮力法
13
3.3 排序问题中的蛮力法
排序:给定一个记录序列(r1,r2,…,rn),其相应的 关键字分别为(k1,k2,…,kn) ,排序是将这些记录 排列成顺序为(rs1,rs2,…,rsn)的一个序列,使得相 应的关键字满足ks1ks2 … ksn(升序或非降序)或 ks1 ks2 … ksn (降序或非升序) 。
2020/9/10
算法设计与分析--蛮力法
6
3.2 查找问题中的蛮力法
3.2.1 顺序查找 3.2.2 串匹配问题
2020/9/10
算法设计与分析--蛮力法
7
3.2.1 顺序查找
顺序查找从表的一端向另一端逐个将元素与给
定值进行比较,若相等,则查找成功,给出该元素 在表中的位置;若整个表检测完仍未找到与给定值 相等的元素,则查找失败,给出失败信息。
0 1 23 456 7 8 9 10 15 24 6 12 35 40 98 55
查找方向
i
2020/9/10
算法设计与分析--蛮力法
8
算法3.1——顺序查找
int SeqSearch1(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合
{ i=n;
基本语句 ?
有序区 已经位于最终位置
无序区 rmin为无序区的最小记录
2020/9/10
算法设计与分析--蛮力法
15
算法3.6——选择排序
void SelectSort(int r[ ], int n) //数组下标从1开始 {
for (i=1; i<=n-1; i++) //对n个记录进行n-1趟简单选择排序 {
10
算法3.2——改进的顺序查找
int SeqSearch2(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合 { r[0]=k; i=n; while (r[i]!=k)
i --; return i; }
算法3.2的基本语句是r[i]!=k,其执行次数为: 数量级相同,
3.3.1 选择排序
3.3.2 起泡排序
2020/9/10
算法设计与分析--蛮力法
14
3.3.1 选择排序
选择排序第i趟排序从第i个记录开始扫描序列, 在n-i+1(1≤i≤n-1)个记录中找到关键码最小的记 录,并和第i个记录交换作为有序序列的第i个记录。
交换
r1 ≤r2 … … ≤ri-1 ri ri+1 … rmin … rn
系数相差一半
n
i 1
pici
1 n
n i 1
(n i
1)
n 1 2
O(n)
2020/9/10
算法设计与分析--蛮力法
11
❖ 一般观点: 用蛮力法设计的算法,都可以对算法的
第一个版本进行一定程度的改良,改进其时 间性能,但只能减少系数,而数量级不会改 变。
2020/9/10
算法设计与分析--蛮力法
while (i>0 && r[i]!=k)
i--;
return i;
}
算法3.1的基本语句是i>0和r[i]!=k,其执行次数为:
n
i 1
pibi
n i 1
pici
1 n
n i 1
(n
i
1)
1 n
n i 1
(n
i
1)
n
1
O(n)
其中pi是第i个元素的查找概率,而bi和ci分别是基本语句 i>0和r[i]!=k的执行次数
2020/9/10
算法设计与分析--蛮力法
9
wk.baidu.com
改进的顺序查找
将待查值放在查找方向的尽头处,免去了在查找过 程中每一次比较后都要判断查找位置是否越界,从 而提高了查找速度。
哨兵
0123456789 k 10 15 24 6 12 35 40 98 55
查找方向
i
2020/9/10
算法设计与分析--蛮力法
2020/9/10
算法设计与分析--蛮力法
3
蛮力法所依赖的基本技术——扫描技术
关键——依次处理所有元素
基本的扫描技术——遍历 (1)集合的遍历 (2)线性表的遍历 (3)树的遍历 (4)图的遍历
2020/9/10
算法设计与分析--蛮力法
4
蛮力法也是一种重要的算法设计技术,原因如下:
(1)理论上,蛮力法可以解决可计算领域的各 种问题。
12
3.2.2 串匹配问题 (略)
串匹配问题——给定两个串S=“s1s2…sn” 和T=“t1t2…tm”,在 主串S中查找子串T的过程称为串匹配,也称模式匹配。
➢ 串匹配问题属于易解问题。 ➢ 串匹配问题的特征:
(1)算法的一次执行时间不容忽视:问题规模 n 很大, 常常需要在大量信息中进行匹配; (2)算法改进所取得的积累效益不容忽视:串匹配操作 经常被调用,执行频率高。