赞
踩
贪心算法给出的问题的解并不一定是最优解。
比如在下面的一个加权图中,我们从顶点 S 开始,找一条到顶点 T 的最短路径(路径中边的权值和最小)。
如果用贪心算法来解决这个问题,那么解决思路是:每次都选择一条跟当前顶点相连的权重最小的边,直到找到顶点 T。按照这种思路,我们求出的最短路径是 S->A->E->T,路径长度是 1+4+4=9。
但是实际上,用贪心算法选择的路径并不是最短的,因为 S->B->D->T 才是最短路径,因为这条路径的长度是 2+2+2=6。
为什么此时贪心算法不一定给出最优解呢?因为前面的选择会影响后面的选择,即便第一步选择最优的走法(边最短),但有可能因为这一步选择,导致后面每一步的选择都很糟糕,最终也就无缘全局最优解了。
分治法解题的一般步骤:
运用分治策略解决的问题一般来说具有以下特点:
在分治策略中,由于子问题与原问题在结构和解法上的相似性,用分治方法解决的问题,大都采用了递归的形式。在各种排序方法中,如归并排序、快速排序等,都存在有分治的思想。
给 10GB 的订单文件按照金额排序这样一个需求,看似是一个简单的排序问题,但是因为数据量大,有 10GB,而我们的机器的内存可能只有 2、3GB ,总之就是小于订单文件的大小因而无法一次性加载到内存,所以基础的排序算法在这样的场景下无法使用;
基本思路:
(1)针对所给问题,定义问题的解空间,它至少包含问题的一个解;
(2)确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间;
(3)以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索;
解题步骤:
在 8×8 的国际象棋棋盘上放置八个皇后,使得任意两个皇后都不能处于同一条横行、纵行或斜线上,如下图所示,请问有多少种摆法?
八皇后的问题可以延申至 n 皇后的问题,比如一个 n x n 的棋盘上摆放n 个皇后,要求任意两个皇后都不能处于同一条横行、纵行或斜线上。当然了这个问题当 n=1 或者 n>=4 时才有解;
我们可以定义一个一维数组 a[n],用以保存所有的解,其中 a[i]就表示了把第 i 个皇后放在第 i 行的列数(i 从 0 开始计算);
由于任意两个皇后不能在同一列,因此任意两个 a[i]和 a[j]的值不能相同(i != j);
由于任意两个皇后不能在同一对角线上,因此对任意i和j,Math.abs(j - i) != Math.abs(a[j] - a[i])(i != j);
/**
* 回溯思想-八皇后问题
*/
public class Queens8 {
/**
* 皇后数组:下标标识行数,值标识列数
*/
private int[] queen;
/**
* 计算并输出n皇后的位置
*/
public void backtrack(int n){
// 数组初始化
queen = new int[n];
// 初始化起点
for (int i=0;i<queen.length;i++){
queen[i] = -1;
}
// 从第一个皇后开始
int k=0;
while (true){
// 第k个皇后移动一格
queen[k] += 1;
//判断是否应该回溯到上一行开始搜索
if (queen[k]>=n) {
//第k个皇后移动后溢出,即移出边界,则确定这一行的皇后没有任何位置可选
if(k>0) {// 如果不是第一个皇后,则第k个皇后起点回归到原始,并回溯到第k-1个皇后
queen[k] =-1;
k--;
continue; // 跳出下面的判断
} else {
break;// 如果是第一个皇后,则已经遍历所有位置,跳出循环
}
}
// 判断皇后在该位置是否不冲突,如果不冲突,更改目标为下一行进行搜索
if (!isMatch(k)) {
k++;
if (k>=n) {// 如果下标k溢出,即超过了皇后数量,则已经确定一个组合,输出
for (int i=0; i<n; i++){
System.out.print(queen[i] + " ");
}
System.out.println();
k--;// 将k回溯到最后一行继续探索其他可能性
}
}
}
}
/**
* 判断第k个皇后是否与之前的皇后冲突
*/
public boolean isMatch(int k){
for (int i=k-1; i>-1; i--){
if (queen[k]==queen[i] || Math.abs(queen[k]-queen[i])==Math.abs(k-i)){
return true;
}
}
return false;
}
/**
* @param args
*/
public static void main(String[] args) {
new Queens8().backtrack(8);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。