1、顺序查找:
遍历数组,对比每一个元素,找到目标元素 返回元素所在的位置 ,否者返回-1;(废话不多 看代码)
/**
* 顺序查找算法
* 找到 返回所在的索引
* 找不到 返回-1
* @param a [] 数组
* @param key 目标元素
* @return 索引 or -1
/
public static int sequentialLookup(int[] a, int key ) {
for(int i=0;i<a.length-1;i++) {
if(key==a[i]) {
System.out.println(key+“所在的位置:”+i);
return i;
}
}
System.out.println(“查无此元素”);
return -1;
}
2、 回溯:(通用解题法)
//闷头向前冲 撞墙后退一步,换个方向再冲,直到找到想要的结果或者答案为止。
这是一种优搜索的方法, 按选优条件向前搜索,如果到达某一步 方法不够优或者不够好,那就退后一步,重新选择。 满足回溯条件的点叫做 回溯点。
(1)、针对问题 定义问题的解空间。
(2)、 确定易于搜索的空间结构,使得能用回溯方法方便的搜索整个空间。
(3)、深度优先的方式搜索空间,并在搜索过程中用剪枝函数避免无效的搜索。
例 经典的8 皇后问题:
在88的棋盘上放 8 个棋子,使其两两互相不在同一行同一列,也不在对角线上,这里就用了穷举的思想。当然 ,如果让人来想这个问题,那麻烦的狠,但是计算机不会累的。
package com.neuedu.toflashback;
/**
- 八皇后问题 利用回溯算法解决
- @author 秋风
*/
public class ToFlashBack {
int[] x;// 当前的解
int N;// 皇后的个数
int sum = 0;// 当前已经找到的可行方案数
public int Queens(int n) {
N = n;
x = new int[N + 1];
back(1);
return sum;
}
/**
* 判断这一点位置是否合理 ,能否放棋子
*
* @param col
* @return true/false
*/
private boolean place(int col) {
for (int i = 1; i < col; i++) {
if (Math.abs(col - i) == Math.abs(x[col] - x[i]) || x[col] == x[i]) {
// 判断该格子 的这一行 以及这一列 和 对角线上 有没有 棋子
return false;
}
}
return true;
}
private void back(int t) {
if (t > N) {
sum++;
} else {
for (int j = 1; j <= N; j++) {
x[t] = j;
if (place(t)) {
back(t + 1);// 递归
}
}
}
}
public static void main(String[] args) {
ToFlashBack tfb = new ToFlashBack();
System.out.println( "一共有"+tfb.Queens(8)+"放置方法");
}
}