码迷,mamicode.com
首页 > 其他好文 > 详细

第五章总结

时间:2019-12-17 18:22:26      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:str   图片   剪枝   else   val   back   swa   写法   idt   

回溯法

一、简介:回溯法有“通用的解题法”之称。用它可以系统的搜索一个问题的所有洁或者任意回溯法是一个几点有系统性又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索值解空间树的任一结点时,先判断该结点是否存在包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先策略搜索。

 

二、问题分析:

  1. 子集树(适用于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);
		}	
	}	
}

  

  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]);
		}
	}	
}

  

  1. 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函数,当解中的某个性质超过预期时,就结束该分支的搜索。

五、编程过程遇到的问题与结对编程的情况

回溯法有模板,难就难在剪枝,需要认真分析,设置好约束条件和边界条件才可以很好地完成任务。

第五章总结

标签:str   图片   剪枝   else   val   back   swa   写法   idt   

原文地址:https://www.cnblogs.com/coding-specification-of-Java/p/12055656.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!