算法——回溯法~递归~迭代~伪代码

回溯法的递归与迭代;子集树与排列树;0-1背包问题,旅行售货员问题,八皇后问题

参考以下链接:
https://blog.csdn.net/weiyuefei/article/details/79316653

回溯法伪代码

参考以下链接:
https://blog.csdn.net/u013390476/article/details/50011261

0-1背包回溯法伪代码及详细代码

参考以下链接:
https://www.cnblogs.com/henuliulei/p/10117280.html

递归与迭代

参考以下链接:
https://www.cnblogs.com/zhizhan/p/4892886.html

基本思想

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。
1、定义一个解空间,它包含问题的解。
2、利用适于搜索的方法组织解空间,比如转化成图或树的形式。图的深度优先搜索,二叉树的后序遍历
3、利用深度优先法搜索解空间,在遍历中寻找并记录可行解或最优解。
总之就是,走不通,就掉头。

递归

定义:​是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。
在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。

特点:思路简单,设计容易,但是由于递归引起一系列的函数调用,并且有可能会有一系列的重复计算,递归算法的执行效率相对较低。

迭代

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭代的初始值。
算法设计相对复杂,但效率高。

递归回溯

退回到上一状态的过程叫做回溯,枚举下一个状态的过程叫做递归

所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后,如果某一层看遍了所有格子,都无法成功摆放,则回溯到上一个皇后,让上一个皇后右移一格,再进行递归。如果八个皇后都摆放完毕且符合规则,那么就得到了其中一种正确的解法,保存起来,继续下一种解法的寻找。

递归回溯算法模板如下:

void Backtrack(int t){
	if(t > n)   //t表示递归深度,n控制递归深度。t>n表示算法已搜索至叶节点
	 Output(x);//Output 记录或者输出可行解
	else{
		for( int i = f(n,t); i <= g(n,t); ++i)
		{      //f(n,t)和g(n,t)表示在当前结点未搜索过的子树的起始编号和终止编号
			x[t] = h(i);
			if(constraint(t) && Bound(t)) Backtrack(t+1);//constraint和bound分别是约束函数和界限函数
		}
	}
}

迭代回溯算法模板如下:

void IterativeBacktrack(void){
 	int t = 1;
 	while(t > 0){
 		if(f(n,t) < g(n,t)){
 			for(int i = f(n,t); i <= g(n,t); ++i){//这个for 是遍历各个值的意思,实际中写成for循环会有逻辑错误
 				x[t] = h(i);
 				if(constraint(t) && bound(t)){
 					if(solution(t)) Output(x);//solution 判断是否已经得到问题的解
 					else t++;
 				}
 				else t--;
 			}
 		}
 	}
 }

回溯法伪代码

检测把皇后放置在棋盘位置 ( row, column ) 是否和前 row-1 行放置的皇后存在互相攻击的情况
row 是行数,column是列数

void NQueensBacktrack::Backtrack(int row) 
        For column: 0 to QueenNumber-1 do 
                 If 检测到位置(row, column)没有和皇后们互相攻击 
                        把一个皇后放到(row, column) 
                        If 这个皇后是在最后一行 
                                打印此时的棋盘 
                        End if 
                        Backtrack(row +1),从下一行开始继续递归 
                End if 
        End for 
End
GetQueen(line,row)
if(line==8)
成功把棋盘复位
else
放置皇后在(line,row)for line+1 的每一个位置row
if row 可用
GetQueen(line+1,row):
esle
把棋盘复位

你可能感兴趣的:(算法)