您的位置:首页 > 其它

【技术文档】《算法设计与分析导论》R.C.T.Lee等·第6章 剪枝搜索方法

2013-08-19 23:11 260 查看
读到“剪枝搜索方法”这个标题,不禁让我想到剪枝搜索方法与分枝限界策略有什么不同?它们的字面意思不都是减少分枝吗?带着这样的疑问,我学习了剪枝搜索方法,以及区分剪枝搜索方法与分治策略、分枝限界策略的异同。

剪枝搜索方法易于解决优化问题,它的基本思想:通过每次迭代,减少输入的数据,使得最终的数据量能在常数时间内解决。经过严格的数学证明(读者会发现这章很多地方都用到了数学证明),得到剪枝搜索方法的时间复杂度与每次迭代的时间复杂度是同级的。

对于剪枝搜索方法与分治策略、分枝限界策略的区别,我的理解是,在每次迭代后,分治策略是将大问题分解成两个子问题,两个子问题都需要解决,剪枝搜索方法也是将大问题分解成子问题,但对于其中的子问题,通过条件筛选,最终只留下一个子问题,其它问题直接抛弃,无需求解。这时,我们就会想到分枝限界策略也是根据条件终止部分分枝的计算,那它们又有什么不同呢?它们的不同在于所根据的条件不同。分枝限界策略通常是以已知的可行解判断另一些可行解是否还有计算的必要,而剪枝搜索方法是通过严格的数学证明(看,又是数学证明!),抛弃一些得不到最终结果或对最终结果没有影响的数据。

为了更好的理解剪枝搜索方法,在这举一个简单的例子(复杂的例子我也说不明白^_^)。“选择问题”是指给定n个元素,确定(选择出)其中第k小的元素。我们能很快想到先排序再选择,用最快的排序方法,也只能将时间复杂度降到O(nlogn),如果我们用剪枝搜索方法解决这个问题,时间复杂度将变成线性的,即O(n)。书中的“找出第k小元素的剪枝搜索方法”写的实在是精炼、明了,在这就直接摘抄如下:

输入:n个元素的集合S

输出:S中第k小元素

步骤:

如果|S|<=5,那么用任何蛮力方法解决该问题
将S分成n/5个子集,每个子集含有5个元素。如果n不是5的倍数,那么在最后的子集中加入一些无穷大数。
对每个子集排序
递归地找出n/5个子集的中位数的中位数p
将S分成S1、S2和S3,使各自包含的元素分别小于、等于和大于p
如果|S1|>=k,那么丢弃S2和S3,在下次迭代时,解决从S1中找出第k小元素的问题;否则,如果|S1|+|S2|>=k,那么p为S中第k小元素;否则,令k'=k-|S1|-|S2|,在下次迭代时求S3中第k'小元素

为什么采用剪枝搜索方法的时间复杂度为O(n),而先排序再选择的时间复杂度为O(nlogn),是因为剪枝搜索方法中将对所有元素排序的O(nlogn)降为对每个子集排序的O(n),还是因为每次迭代都能排除1/4的元素?我觉得是后者,你觉得呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐