第十二章 搜索法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十二章搜索法
无论什么类型的试题,只要能归纳出数学模型,我们尽量用解析方法求解。因为一个好的数学模型建立了客观事物间准确的运算关系。运用这个数学模型直接求解是再合适不过的了。当然,这仅是一种可能性,因为并非所有选手都能在竞赛的“一瞬间”把问题分析得如此透彻,并非所有给定的问题都能建立数学模型,即便有了数学模型,但解该模型的准确方法也不一定能立即运用现成算法。因此在某些情况下,还得需要通过搜索(列举所有可能情况)来寻求问题的解。下面介绍两种最常用的搜索策略
⑴枚举法
⑵回溯法
⑶广度优先搜索
§12.1枚举法
枚举法的基本思想是根据提出的问题枚举所有可能状态,并用问题给定的条件检验哪些是需要的,哪些是不需要的。能使命题成立,即为其解。虽然枚举法本质上属于搜索策略,但是它与后面讲的回溯法有所不同。因为适用枚举法求解的问题必须满足两个条件:1.⑴可预先确定每个状态的元素个数n;
2.⑵状态元素a
1,a
2
,…,a
n
的可能值为一个连续的值域。
设
a
i1—状态元素a
i
的最小值;a
ik
—状态元素a
i
的最大值(1≤i≤n),即a
11
≤a1≤a1k,a21≤
a2≤a2k,a i1≤a i≤a ik,……,a n1≤a n≤a nk
我们称状态元素为枚举变量。例如某问题的枚举变量有3个:a1,a2,a3。其中
1≤a1≤2;2≤a2≤4;5≤a3≤7
则问题的可能状态集为
(a1,a2.a3)={(1,2,5),(1,2,6),(1,2,7),(1,3 ,5),(1,3,6),(1,3,7),(1,4,5),(1,4,6),(1,4,7),(2,2,5),(2,2,6),(2,2,7),
(2,3,5),(2,3,6),(2,3,7),(2,4,5),(2,4,6),(2,4,7)}
在上述18个可能的状态集中,满足问题给定的检验条件的状态即为问题的解。一般来说,如果确定了枚举变量的个数及其值域,我们则可以利用for语言和条件判断语句逐步求解或证明:
for a1←a11 to a1k do
fo a2←a21 to a2k do
……………………
for a i←a i1 to a ik do
……………………
for a n←a n1 to a nk do
if 状态(a1,…,a i,…,a n)满足检验条件
then 输出问题的解;
由此可见,枚举的次数为∏
=
+ -
n
i
i
ik
a
a
1
1
)1 (。
枚举法的优点:
⑴由于枚举算法一般是现实生活中问题的“直译”,因此比较直观,易于理解;
⑵由于枚举算法建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明。
枚举法的缺点:枚举算法的效率取决于枚举状态的数量以及单个状态枚举的代价,因此效率
比较低。
当然,由于模型建立的不同、信息提取量的不同,同一个问题可以有多个枚举算法,效率也可能有所不同,甚至可能有很大的差异。
一、“直译”的枚举算法
将自然语言描述的问题“翻译”成算法过程,即为“直译”。现实生活中的许多问题可以“直译”成枚举算法。例如古代著名的“百鸡百钱”(公鸡一只5文钱,母鸡一只3文钱,小鸡3只一文钱。要求计算一百钱可买3种鸡的数量)问题就是一个典型的枚举问题。
状态:3种鸡的数量x ,y ,z
每个状态元素的取值范围:1≤x ≤⎥⎦
⎥
⎢
⎣⎢5100-2,1≤y ≤⎥⎦
⎥
⎢
⎣⎢3100-2,z=100-x-y
约束条件:5*x+3*y+z/3=100 由此“直译”成如下枚举算法 for x ←1 to 18 do for y ←1 to 31 do begin
z ←100-x-y ;
if 5*x+3*y+z/3=100 then 输出公鸡x 只,母鸡y 只,小鸡z 只; end ;{for}
从上例可以看出,能够被“直译”的问题一般具有下列特征
⑴建立在离散模型上;
⑵状态的数量和枚举单个状态的代价确定; ⑶枚举算法的时间复杂度为一个多项式;
下面,我们再来看一个较为复杂的问题是如何“直译”成枚举算法的
【例题12.1.1】跳远
在水平面上整齐的放着n 个正三角形,相邻两个三角形的底边之间无空隙,如下图所示。
一个小孩子想站在某个三角形i 的顶端,跳到三角形j 的顶端上(i 请编程求出他从每个位置起跳能到达的最远三角形的编号。注意:跳跃过程中不许碰到非起点和终点的其他三角形。 输入 第一行为两个正整数n ,v 0(3≤n ≤10, 1≤v 0≤100),表示三角形的个数和最大水平初速度。 第二行有n 个正整数l i (1≤l i ≤20),表示从左到右各个三角形的边长。 输出 输出仅一行,包括n-1个数,表示从三角形1,2,3…n -1的顶点出发能到达的最右的三角形编号。如果从某三角形出发无法达到任何三角形,相应的数为0。 分析:本题的基本思想是枚举。对于每一个起跳点i ,依次判断点i+1, i+2…n 能否跳到。 状态:起跳点i 和i 点后的点j