第五章总结
Posted coding-specification-of-java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五章总结相关的知识,希望对你有一定的参考价值。
回溯法
一、简介:回溯法有“通用的解题法”之称。用它可以系统的搜索一个问题的所有洁或者任意回溯法是一个几点有系统性又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索值解空间树的任一结点时,先判断该结点是否存在包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先策略搜索。
二、问题分析:
- 子集树(适用于0-1背包类问题)
void Backtrace(int t) { if (t > n) { Output(x); } else { for (int i = 0; i <= 1; i++) { x[t] = i; } if (Constrain(t) && Bound(t)) { Backtrace(t + 1); } } }
- 排列树(找到合适的排序方式的问题)
void Backtrace(int t) { if (t > n) { Output(x); } else { for (int i = t; i <= n; ++i) { Swap(x[t], x[i]); if (Constrain(t) && Bound(t)) { Backtrace(t + 1); } Swap(x[t], x[i]); } } }
- n叉树(适用于n后类问题)
void backtrack(int t) { If(t>n) { Output(x); } Else { For(int i=0;i<k;i++) { X[t]=value; If(constraint(t)&&bound(t)); Backtrack(t+1); } } }
三、回溯法不足与改进:
回溯法如果每个可行的解都去遍历的话,当数据量很大时会耗费很多的资源,所以我们应该设置限界函数和约束函数进行对一些不可能得到目标解的分支减去,不同的问题,设置的条件不同,具体情况具体分析;
Bound函数的通常写法
int bound(int t) { int b=0; int i; for(i=t;i<=n;i++) b+=p[i]; return b; }
四、对子集树问题的解空间和约束函数的说明
子集树的解空间树:
约束函数:
要根据具体问题的中提供的条件;
通常是用if函数,当解中的某个性质超过预期时,就结束该分支的搜索。
五、编程过程遇到的问题与结对编程的情况
回溯法有模板,难就难在剪枝,需要认真分析,设置好约束条件和边界条件才可以很好地完成任务。
以上是关于第五章总结的主要内容,如果未能解决你的问题,请参考以下文章