IDDFS,本人译作迭代深度的深度优先搜索。其实上就是深度优先搜索,只不过它对搜索深度进行了限制,使得在搜索到限制深度后必须开始新的搜索路径。以至于看上去像是广搜(总是先完成第n的所有节点的搜索,再开始第n+1的节点的搜索。放在这里的话,n指的就是当前的限制深度)。代码如下:
package com.wly.algorithmbase.search;
import com.wly.algorithmbase.datastructure.ArrayStack;
/**
* Iterative deepening depth-first search
* 整体是等同BFS,内存开销是等同DFS
* 通常广搜用队列实现,深搜用栈实现,有点复杂哈
* @author wly
*
*/
public class IDDFS {
public static ArrayStack stack;
//3节点子树模型:
// n
//2n+1 2n+2
//用数组表示的树结构,想要"米"观一些,费了老大劲了
public static int[] tree = {
45,
23, 67,
11, 33, 55, 89,
5, 15, 28, 40, 49, 60, 81, 101
};
public static boolean[] visitedFlag = new boolean[15];
public static void main(String[] args) {
stack = new ArrayStack();
for(int i=0;i<4;i++) {
System.out.println("============层数:" + i);
DFS(i);
}
}
/**
* 基于深度限制h的深度优先搜索
* @param h
*/
public static void DFS(int h) {
int index = 0;
if(h < 0) {
System.out.println("错误,检索深度不能小于0!");
return ;
}
initVisitedFlag();//初始化访问标记数组
stack.push(tree[index]); //将起点放入到栈中
visitedFlag[index] = true;
int n = 0;
while(!stack.isEmpty()) {
stack.printElems();
if((2*index + 1) < tree.length &&
!visitedFlag[2*index+1] && n < h) {//检查左子节点,对应的是2*n+1
stack.push(tree[2*index+1]);
visitedFlag[2*index+1] = true;
index = 2*index+1;
n ++;
} else if((2*index + 2) < tree.length &&
!visitedFlag[2*index+2] && n < h){//检查右子节点,对应的是2*n+2
stack.push(tree[2*index+2]);
visitedFlag[2*index+2] = true;
index = 2*index+2;
n ++;
} else {
stack.pop();
n --;
index = (int)Math.ceil(((index-2)/2.0)); //向上取整,注意为double,否则容易出错
}
}
}
/**
* 设置访问标记为false
*/
public static void initVisitedFlag() {
for(int i=0;i<visitedFlag.length;i++) {
visitedFlag[i] = false;
}
}
}
package com.wly.algorithmbase.datastructure;
/**
* 使用数组实现栈结构
* @author wly
*
*/
public class ArrayStack {
private int[] tArray;
private int topIndex = -1; //表示当前栈顶元素的索引位置
private int CAPACITY_STEP = 12; //数组容量扩展步长
public ArrayStack() {
/***创建泛型数组的一种方法***/
tArray = new int[CAPACITY_STEP];
}
/**
* 弹出栈顶元素方法
* @return
*/
public int pop() {
if(isEmpty()) {
System.out.println("错误,栈中元素为空,不能pop");
return 0;
} else {
int i = tArray[topIndex];
tArray[topIndex--] = 0; //擦除pop元素
return i;
}
}
/**
* 向栈中插入一个元素
* @param t
*/
public void push(int t) {
//检查栈是否已满
if(topIndex == (tArray.length-1)) {
//扩展容量
int[] tempArray = new int[tArray.length + CAPACITY_STEP];
for(int i=0;i<tArray.length;i++) {
tempArray[i] = tArray[i];
}
tArray = tempArray;
tempArray = null;
} else {
topIndex ++;
tArray[topIndex] = t;
}
}
/**
* 得到栈顶元素,但不弹出
* @return
*/
public int peek() {
if(isEmpty()) {
System.out.println("错误,栈中元素为空,不能peek");
return -1;
} else {
return tArray[topIndex];
}
}
/**
* 判断当前栈是否为空
* @return
*/
public boolean isEmpty() {
return (topIndex < 0);
}
/**
* 打印栈中元素
*/
public void printElems() {
for(int i=0;i<=topIndex;i++) {
System.out.print(tArray[i] + " ");
}
System.out.println();
}
}
运行结果:
============层数:0
45
============层数:1
45
45 23
45
45 67
45
============层数:2
45
45 23
45 23 11
45 23
45 23 33
45 23
45
45 67
45 67 55
45 67
45 67 89
45 67
45
============层数:3
45
45 23
45 23 11
45 23 11 5
45 23 11
45 23 11 15
45 23 11
45 23
45 23 33
45 23 33 28
45 23 33
45 23 33 40
45 23 33
45 23
45
45 67
45 67 55
45 67 55 49
45 67 55
45 67 55 60
45 67 55
45 67
45 67 89
45 67 89 81
45 67 89
45 67 89 101
45 67 89
45 67
45
好了,先到这里,,
谢谢!!