2009-2010-2《算法分析》ppt-2蛮力法
5蛮力法

2
1 枚举法
枚举法(穷举法)是蛮力策略的一种表现形式,根据问题 中条件将可能情况一一列举出来,逐一尝试从中找出满足 问题条件的解。但有时一一列举出的情况数目很大,则需 要进一步考虑,排除一些明显不合理的情况,尽可能减少 问题可能解的列举数目。 通常从两个方面进行算法设计: 1)找出枚举范围:分析问题所涉及的各种情况。 2)找出约束条件:分析问题的解需要满足的条件,并 用逻辑表达式表示。
5
算法设计2: 在公鸡(x)、母鸡(y)的数量确定后,小鸡的数量 z就固定为100-x-y,无需再进行枚举了。 此时约束条件只有一个: 5*x+3*y+z/3=100.
6
main( ) { int x,y,z; for(x=1;x<=20;x=x+1) for(y=1;y<=33;y=y+1) { z=100-x-y; if(z mod 3=0 and 5*x+3*y+z/3=100) {print("the cock number is",x); print("the hen number is", y); print("the chick number is ",z);} } } 算法分析:以上算法只需枚举尝试20*33=660次。实现时约束条件 限定Z能被3整除时,才判断“5*x+3*y+z/3=100”。这样省去了z不 整除3时的算术运算和条件判断,进一步提高了算法效率。
蛮力法并不总是因为减少了人脑的思维,就一 定是效率差的算法。对规模不是太大的问题, 蛮力法还是一种比较好的算法策略。
22
编号与因数个数的关系
n d(n) 1 1 2 2 3 2 4 3 5 2 6 4 7 2 8 4 9 3 10 4 11 2 12 6 13 2 14 4 15 4 16 „„ 5 „„
算法设计与分析-第3章-蛮力法

哨兵
0123456789 k 10 15 24 6 12 35 40 98 55
查找方向
i
清华大学出版社
算法设计与分析
算法3.2——改进的顺序查找
int SeqSearch2(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合 { r[0]=k; i=n; while (r[i]!=k)
清华大学出版社
算法设计与分析
第3章 蛮力法
3.1 蛮力法的设计思想 3.2 查找问题中的蛮力法 3.3 排序问题中的蛮力法 3.4 组合问题中的蛮力法 3.5 图问题中的蛮力法 3.6 几何问题中的蛮力法 3.7 实验项目——串匹配问题
清华大学出版社
算法设计与分析
3.1 蛮力法的设计思想
蛮力法的设计思想:直接基于问题的描述。 例:计算an
52 37 65 不可行 不可行 不可行 不可行 不可行
清华大学出版社
算法设计与分析
对于一个具有n个元素的集合,其子集 数量是2n,所以,不论生成子集的算法 效率有多高,蛮力法都会导致一个Ω(2n) 的算法。
清华大学出版社
算法设计与分析
3.4.4 任务分配问题
假设有n个任务需要分配给n个人执行, 每个任务只分配给一个人,每个人只分配一 个任务,且第j个任务分配给第i个人的成本 是C[i, j](1≤i , j≤n),任务分配问题要求 找出总成本最小的分配方案。
用蛮力法解决0/1背包问题,需要考虑给定n个 物品集合的所有子集,找出所有可能的子集(总重 量不超过背包容量的子集),计算每个子集的总价 值,然后在他们中找到价值最大的子集。
清华大学出版社
算法设计与分析
10
ACM蛮力(穷举)PPT课件

chicken=%-2d\n", j, x, y, z); j++;} } }
.
10
运行结果: Possible solutions to buy 100 fowls whith 100 wen:
1: cock=0 hen=25 chicken=75 2: cock=4 hen=18 chicken=78 3: cock=8 hen=11 chicken=81 4: cock=12 hen=4 chicken=84
.
14
#include "stdio.h" main() { int m, count=0;
运行结果: 52 157 262 367 472 577 682 787 892 997
for ( m=1; m<=1000; m++ )
if ( m%3==1&&m%5==2&&m%7==3)
{ printf("%5d",m);
count++;
if(count%5==0) printf("\n");
}
}
.
15
常用的蛮力法
1.搜索所有的解空间。 2.搜索所有的路径。 3.直接进行计算。
.
16
搜索所有的解空间
案例1:假金币 案例2:现在的时间是多少?
.
17
案例1:假金币
False coin
Time Limit:3000MS Memory Limit:10000K
蛮力法是一种直接解决问题的方法,常常 直接基于问题的描述和所涉及的概念定义。
蛮力法-选择排序、冒泡排序

蛮⼒法-选择排序、冒泡排序时间总让我有后知后觉的挫感,或许是因为我从不愿记录过往。
3.1.1 选择排序(n个元素,0~n-1,升序,不稳定)对数组A做i次扫描(0<=i<=n-2),每次从最后n-i个元素中寻找最⼩元素,然后将它与A i交换。
代码实现/*** 选择排序(升序)* @param array 排序的数组* */public static void selectSort(int[] array){for(int i=0;i<array.length-1;i++){int min=i;for(int j=i+1;j<array.length;j++){if(array[min]>array[j]){min=j;}}if(min!=i){int temp=array[i];array[i]=array[min];array[min]=temp;}}}算法分析因此,对于任何输⼊来说,选择排序都是⼀个θ(n2)的算法。
3.1.1 冒泡排序(n个元素,0~n-1,升序,稳定)⽐较相邻元素A j和A j+1,若A j>A j+1,交换它们的位置,依次这样,最终,最⼤元素“沉到”最后⼀个位置。
重复n-1遍以后,就排好序了。
代码实现/*** 冒泡排序(升序)* @param array 排序的数组* */public static void bubbleSort(int[] array){for(int i=0;i<array.length-1;i++){for(int j=0;j<array.length-1-i;j++){if(array[j]>array[j+1]){int temp=array[j];array[j]=array[j+1];array[j+1]=temp;}}}}算法分析最坏情况和平均情况下都是属于θ(n2)。
实际上,可以针对上⾯的代码进⾏⼀定的改良,当对数组迭代⽐较⼀遍之后没有进⾏元素的交换,那么表⽰该数组已排好序了。
ACM蛮力(穷举)ppt课件

精品课件
3
蛮力搜索——定义
蛮力法是一种直接解决问题的方法,常常 直接基于问题的描述和所涉及的概念定义。
精品课件
4
使用蛮力法的理由
显然蛮力法(也叫穷举法)不是一个最 好的算法选择,但当我们想不出别的更 好的办法时,它也是一种有效的解决问 题的方法。
蛮力法逻辑清晰,编写程序简洁。
ACM程序设计时间紧张,使用高效的、 巧妙的算法可能忽略掉一些解,而测试 数据往往针对你可能忽略的情况。
精品课件
20
Output
Write to the output file the identifier of the false coin or 0, if it cannot be found by the results of the given weightings.
精品课件
21
Sample Input
精品课件
17
案例1:假金币
False coin
Time Limit:3000MS Memory Limit:10000K
精品课件
18
Description
The "Gold Bar"bank received information from reliable sources that in their last group of N coins exactly one coin is false and differs in weight from other coins (while all other coins are equal in weight). After the economic crisis they have only a simple balance available (like one in the picture). Using this balance, one is able to determine if the weight of objects in the left pan is less than, greater than, or equal to the weight of objects in the right pan. In order to detect the false coin the bank employees numbered all coins by the integers from 1 to N, thus assigning each coin a unique integer identifier. After that they began to weight various groups of coins by placing equal numbers of coins in the left pan and in the right pan. The identifiers of coins and the results of the weightings were carefully recorded. You are to write a program that will help the bank employees to determine the identifier of the false coin using the results of these weightings.
2009-2010-2《算法分析》ppt-3分治法

合并排序
复杂度分析 O(1) n 1 T (n) 2T (n / 2) O(n) n 1 T(n)=O(nlogn) 渐进意义下的最优算法
合并排序(P97)
初始序列
[49] [38] [65] [97] [76] [13] [27]
第一步
[38 49]
[65 97]
[13 76]
例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。
整数划分问题
前面的几个例子中,问题本身都具有比较明显的 递归关系,因而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难 以找到递归关系,因此考虑增加一个自变量:将 最大加数n1不大于m的划分个数记作q(n,m)。可以 建立q(n,m)的如下递归关系。
大整数乘法
例 A=2348,B=3825 a1=23,a2=48,b1=38,b2=25 p=(a1+a2)(b1+b2)=71 *63=4473 q=a1b1=874, r=a2b2=1200 AB=8740000+(4473-874-1200)*100+1200 =8740000+239900+1200 =8981100
分治法的复杂性分析
O(1) n 1 T (n) kT (n / m) f (n) n 1
《算法设计与分析基础》课件-3.蛮力法
if A[j] < A[min] min j
swap A[i] and A[min]
7
2017/12/31
例题:对序列 {89,45,68,90,29,34,17}用选择排序 算法进行排序
• 第1遍: {89,45,68,90,29,34,17} //求最小元素 {17,45,68,90,29,34,89} //交换
• 第5遍: {17,29,34,45,90,68,89} {17,29,34,45,68,90,89}
• 第6遍: {17,29,34,45,68,90,89} {17,29,34,45,68,89,90} //排序结束
8
CHD
(本动画中,参与排序的是R[1]到R[n],R[0]作为交换中转的空 间;变量j对应前面算法中的变量min)
2017/12/31
ALGORITHM BubbleSort(A[0,…,n – 1]) // 冒泡排序算法在数组上的应用 // 输入:数组A,数组中的元素属于某偏序集 // 输出:按升序排列的数组A for i 0 to n – 2 do
for j 0 to n – 2 – i do if A[j+1] < A[j] swap(A[j], A[j+1])
CHD
(4)对解决一些小规模的问题实例仍然有效
(5)可作为衡量其他算法的参照。
2
2017/12/31
Brute Force Examples:
1. Computing an (a > 0, n a nonnegative integer)
2. Computing n!
3. Multiplying two matrices
第1章 蛮力法
成的序列a1, a2, …, an, 求该序列形如 子段和的最大值。
∑a
k =i
k
的
例如,当序列为{-2, 11, -4, 13, -5, -2}时, 最大子段和为4Βιβλιοθήκη ∑ak =2k
= 11 + (−4) + 13 = 20
如何穷举?如果采用蛮力法,上述序列共 有多少种情况需要穷举?
3.2 找钱问题
未 达 达 到 到 未 未 达 到
1 3 4
0 2 4
1 4 0
…
4 3 2
2.4 进制工具(一)
进制工具来源于k进制数。 k进制从小到大排列 (位数不足补0)时,数字呈现字典序。例如,000, 001, 010, … 111。又例如,000, 001, 002, 010, …, 222 进制状的数据变化各个位置上的数字可以自由变化, 而不像排列组合一样,受到其他位置上的制约 进制工具可以不使用类单独封装数据和方法,而是 直接用数进行循环,然后在循环中解码当前循环数
如果不限定称重次数,采用穷举法,上述两 种情况该如何判断?
3.7 凸包问题
给定n个点构成的平面上的点集,求出其凸包
由凸包的性质,当由点集中的若干点构成一个凸 多边形而其他点全部在这个多边形中时,这就是问 题的解 穷举需要两重:一是对点数穷举,而是对给定的 点数进行排列方式的穷举
3.8 查找问题
如何在一个一维数组中查找一个数值? 如果这个数组中的数据已经从小到大排序 过了呢?
3. 穷举法举例
3.1 最大子段和问题 3.2 找钱问题 3.3 背包问题 3.4 TSP问题 3.5 n皇后问题 3.6 假币问题 3.7 凸包问题 3.8 查找问题 6.9 排序问题 3.10 多段最短路径问题 3.11 任务分配问题 3.12 气球膨胀问题
算法-第3章-蛮力法
for i←0 to n-2 do
for j←0 to n-2-i do if A[j+1]<A[j]
该算法是否稳定?
swap A[j] and A[j+1]
89 45 45 45 45 45 45 45 45 45
?
45 68 90 29 34 17 ? 89 68 90 29 34 17 ? ? 68 89 90 29 34 17 ? 68 89 29 90 34 17 ? 68 89 29 34 90 17 68 89 29 34 17 90 68 68 68 68
3.2.1 顺序查找 该算法只是简单地将给定列表中的连续元素和给定的 查找键作比较,直到遇到一个匹配的元素(查找成 功),或者在遇到元素前就遍历了整个列表(失败查 找) 算法 SequentialSearch2(A[0..n],K) //顺序查找的算法实现,它用了查找键来做限位器 //输入:一个n个元素的数组A和一个查找键K //输出:第一个值等于K的元素的位置,如果找不到这样 的元素,返回-1
n m
p(i 1 m ) i
0
1
n m
(i 1 m ) 1i
0
n m
n m
2
1 (n m )
3.3 最近对和凸包问题的蛮力算法
3.3.1 最近对问题 最近对问题要求找出一个包含n个点的集合中 距离最近的两个点。两个点Pi=(xi,yi)和Pj=(xj,yj) 这间的距离是标准的欧几里得距离:
所以如果我们用dsqr←(xi-xj)2+(yi-yj)2代替 d←sqrt(xi-xj)2+(yi-yj)2,该算法的基本操作就是求 平方。平方操作的执行次数可以这样计算:
蛮力法 (2)
11
【例】贴纸问题 有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。五人对 坐,每人都可以看到其他人额头上的纸的颜色。五人相互观察后, A说:“我看见有三人额头上帖的是白纸,一人额头上帖的是黑纸” B说:“我看见其他四人额头上帖的都是黑纸” C说:“我看见有一人额头上帖的是白纸,其他三人额头上帖的是黑纸” D说:“我看见其他四人额头上帖的都是白纸” E说:什么也没有说 现在已知额头上帖黑纸的人说的都是谎话,额头上贴白纸的人说的都 是实话,请你编写程序,求出这五个人谁的额头上帖的白纸,谁的额 头上帖的黑纸。
蛮力算法的优缺点:
(1)可以用来解决广阔领域的问题; (2)算法设计思想简单明了; (3)可以解决一些小规模的问题; (4)算法的效率不高,随着问题规模的增大,算法效率急剧下降; (5)问题规模过大时,在时间上,有些蛮力算法不可行。
15
作业1:用蛮力算法求解古堡问题
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!” 于是,两人沉默了好久,还是没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案。 把 ABCDE 所代表的数字写出来。
蛮力法
1
蛮力法
蛮力法是基于计算机运算速度快这一特性,在解决问题 时采取的一种“懒惰” 策略。这种策略不经过(或者说经过 很少)思考,把问题所有情况或所有过程交给计算机去一 一尝试,从中找出问题的解。 蛮力策略应用:选择排序、冒泡排序、插入排序、顺序 查找、朴素的字符串匹配等。比较常用还有枚举法、盲目
搜索算法等。
2
1 枚举法
枚举法(穷举法)是蛮力策略的一种表现形式,根据问题 中条件将可能情况一一列举出来,逐一尝试从中找出满足 问题条件的解。但有时一一列举出的情况数目很大,则需 要进一步考虑,排除一些明显不合理的情况,尽可能减少 问题可能解的列举数目。 通常从两个方面进行算法设计: 1)找出枚举范围:分析问题所涉及的各种情况。 2)找出约束条件:分析问题的解需要满足的条件,并 用逻辑表达式表示。