算法练习一:回溯算法练习

练习

 


4. 证明在两船装载问题中,只要存在一种方法能装载所有货箱,则通过尽可能装满第一艘船就可找到一种可行的装载方法。

 


5. 运行程序1 6 - 3和1 6 - 4的代码,测试它们的相对运行时间。

 


6. 运用1 6 . 2 . 1节中第4小节的方法1) 来更新程序1 6 - 3,使其能得到时间复杂性O ( 2n )。

 


7. 运用1 6 . 2 . 1节中第4小节的方法2) 来修改程序1 6 - 3,使其运行时间减少至O ( 2n )。

 


8. 为子集之和问题写一个递归回溯算法。注意,只要找到一个子集,其和为c1,则可终止程序运行。没有必要记住目前的最优解。代码不应使用像程序1 6 - 3中的数组x。在找到和为c1

 


的子集之后展开递归,可以重构出最优解。

 


9. 优化程序1 6 - 7和1 6 - 9以便能产生出与背包问题最优解相对应的一个0 / 1数组x。

 


10. 用迭代回溯算法求解0 / 1背包问题。该算法与程序1 6 - 4类似。可以修改K n a p : : B o u n d,使其返回被装入背包的最后一个对象i,这样可避免根据B o u n d重新向左移动而可直接移动到最左节点(原先由B o u n d确定)。

 


11. 编写程序1 6 - 1 0(与程序1 6 - 4相对应)的迭代版本并比较这两个版本。

 


12. 改写程序1 6 - 1 0,使其首先按度的递减次序来排列各顶点。你认为该版本比程序1 6 - 1 0

 


好吗?

 


13. 编写一个求解最大独立集问题的回溯算法。

 


14. 重写最大完备子图代码(见程序1 6 - 1 0),把它作为类U N e t w o r k的成员。对于类ADjacencyGraph, AdjacencyWGraph, LinkedGraph和L i n k e d W G r a p h(见1 2 . 7节)的成员,该代码同样有效。

 


15. 令G为一个n 顶点的有向图,M a xi 为从顶点i 出发的具有最大耗费的边的耗费

 


1) 证明旅行商的每一个旅行有一个小于n åi =1M a xi + 1的耗费。

 


2) 使用上述界限作为b e s t c的初始值。重写T S P和t S P,尽可能简化它们。

 


16. 令G为具有n 个顶点的有向图, M i n O u ti 为从顶点i 出发的具有最小耗费的边的耗费

 


1) 证明具有前缀x1 到xi 的旅行商的所有旅行耗费至少为i åj =2A(xj - 1, xj )+n åy=iM i n O u txj 其中A(u,v)是边(u,v)的耗费。

 


2) 在程序1 6 - 1 2中,使用

 


if (a [x [i-1] ] [x [j] ] ! = NoEdge &&(cc + a [x [i-1] ] [x ] < bestc | |bestc == NoEdge) )

 


来决定何时移动到一个孩子节点。要求使用1) 的结果得到一个更强的条件。第一个和可根据cc 计算出来,通过用一个新变量r 保留不在当前路径中的顶点的M i n O u t [ i ]的和,可以很容易地计算出第二个和。

 


3) 测试t S P的新版本。与程序1 6 - 1 2比较,它访问了排列树的多少节点?

 


17. 考察电路板排列问题。Ni 的长度为Ni 中第一块和最后一块电路板间的距离。N4 中第一个电路板在插槽3中,最后一个电路板在插槽6中,则N4 的长度为3。N2 的长度为2。Ni 最大值为3。编写一个回溯算法以找到具有最小的最大长度的板排列。试测试代码的正确性。

 


18. [顶点覆盖] 令G为一个无向图。当且仅当对于G中的每一条边(u , v),u 或v 或u , v 在U中时,G的顶点子集U是一个顶点覆盖(vertex cover)。U中顶点的数量是覆盖的大小。在图1 6 - 7 a中,{ 1 , 2 , 5 }是大小为3的一个顶点覆盖。编写一个回溯算法寻找具有最小尺寸的顶点覆盖。算法的复杂性是多少?

 


19. [简易最大切割] 令G是一个无向图。U是G中顶点的任意子集。V是G余下的点的集合。一个端点在U中,另一个端点在V中的边的数量是U所定义的切割( c u t)的大小。编写一个回溯算法,寻找最大切割的大小和相应的U。算法的复杂性是多少?

 


20. [机器设计] 某机器由n 个部件组成,每一个部件可从3个投资者那里获得。令wi j 是从投资者j 那里得到的零件i 的重量,ci j 则为该零件的耗费。编写一个回溯算法,找出耗费不超过c的机器构成方案,使其重量最少。算法的复杂性是多少?

 


21. [网络设计] 一个汽油传送网络可由加权的有向无环图G表示。G中有一个称为原点的顶点S。从S出发,汽油被输送到图中的其他顶点。S的入度为0,每一条边上的权给出了它所连接的两点间的距离。通过网络输送汽油时,压力的损失是所走距离的函数。为了保证网络的正常运转,在网络传输中必须保证最小压力Pm i n 。为了维持这个最小压力,可将压力放大器放在网络中的一些或全部顶点。压力放大器可将压力恢复至最大可允许的量级Pm a x。令d为汽油在压力由Pm a x 降为Pm i n 时所走的距离。在设置信号放大器问题中,需要放置最少数量的放大器,以便在遇到一个放大器之前汽油所走的距离不超过d。编写一个回溯算法来求解该问题。算法的复杂性是多少?

 


22. [n 皇后问题] 在n 皇后问题中,我们希望在n×n 的棋盘上找到一个n 皇后的放置方法以便任意两个皇后之间不冲突。当且仅当两个皇后在相同的排、列、对角线或反对角线上时,她们之间将发生冲突。假定在任何可行的解决方案中,皇后i 被放置在棋盘的第i 排。所以只对决定每一个皇后所在的列感兴趣。令ci 为皇后i 所处的列。如果任意两个皇后不冲突,则[c1 , .,cn ]是[1, 2, ., n]的一个排列。n 皇后问题的解空间因此被限制到[1, 2, ., n]的所有排列中。

 


1) 将n 皇后的解空间组织成一棵树。

 


2) 编写一个回溯算法,搜索n 皇后问题的可行排列。

 


*23. 编写一个函数,使用回溯算法来搜索一个子集空间树,该树为一个二叉树。函数中的参数应包含如下函数:确定一个节点是否可行的函数,计算该节点的界限值的函数,决定界限是否优于另一个值的函数等。用0 / 1背包问题来测试程序。

 


*24. 使用排列空间树来完成练习2 3。

 


*25. 编写一个函数,用回溯法搜索一个解空间。函数中的参数应包括下列函数:产生节点的下一个孩子的函数,决定下一个孩子是否是可行的函数,计算该节点界限的函数,决定该界限值是否优于另一个值的函数等。用0 / 1背包问题来测试程序。

 



( 说明:本资料是根据《数据结构、算法与应用》(美,Sartaj  Sahni著)一书第13-17章编辑、改写的。考虑到因特网传输速度等因素,大部分插图和公式不得不被删除。对于内容不连贯之处,请网友或读者参阅该书,敬请原
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值