}
}
6.排列问题
Template <class Type>
void perm(Type list[], int k, int m )
{ //产生[list[k:m]的所有排列
if(k==m)
{//只剩下一个元素
for (int i=0;i<=m;i++) cout<<list[i];
cout<<endl;
}
else//还有多个元素待排列,递归产生排列
for (int i=k; i<=m; i++)
{
swap(list[k],list[i]);
perm(list,k+1;m);
swap(list[k],list[i]);
}
}
四、问答题
1.分治法的基本思想时将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
2设计动态规划算法的主要步骤为:
(1)找出最优解的性质,并刻划其结构特征。(2)递归地定义最优值。(3)以自底向上的方式计算出最优值。(4)根据计算最优值时得到的信息,构造最优解。
3. 分治法与动态规划法的相同点是:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
两者的不同点是:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。
4. 分支限界法与回溯法的相同点是:都是一种在问题的解空间树T中搜索问题解的算法。
不同点:(1)求解目标不同;
(2)搜索方式不同;
(3)对扩展结点的扩展方式不同;
(4)存储空间的要求不同。
5用回溯法搜索子集树的算法为:
void backtrack(int t)
{
if (t>n) output(x);
else
for (inti=0;i<=1;i++) {
x[t]=i;
if (constraint(t)&&bound(t))backtrack(t+1);
}
}
6. 分治法所能解决的问题一般具有的几个特征是:
(1)该问题的规模缩小到一定的程度就可以容易地解决;
(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
(3)利用该问题分解出的子问题的解可以合并为该问题的解;
(4)原问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
7.用分支限界法设计算法的步骤是:
(1)针对所给问题,定义问题的解空间(对解进行编码);分
(2)确定易于搜索的解空间结构(按树或图组织解) ;
(3)以广度优先或以最小耗费(最大收益)优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
8. 常见的两种分支限界法的算法框架
(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 (2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。
9. 回溯法中常见的两类典型的解空间树是子集树和排列树。
当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。这类子集树通常有2n个叶结点,遍历子集树需O(2n)计算时间 。
当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。这类排列树通常有n!个叶结点。遍历排列树需要O(n!)计算时间。
10. 分支限界法的搜索策略是:
在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。为了有效地选择下一扩展结点,加速搜索的进程,在每一个活结点处,计算一个函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-23877-11.html
wuIi烊烊