水两篇数据结构的内容~ ,这几天做了几道算法题。在ACM POJ上广度搜索深度搜素都是比较基础的算法,所以不针对具体的题目了。
先上JAVA版本的广度搜索核心代码:
//假设需要使用一个数组坐标系来实现,定义一个坐标类
public static class Point {
int x,y;
public Point(int x,int y) {
this.x = x;
this.y = y;
}
在这里假设了使用数组,根据数组坐标搜索的场景,如果有其他需要更多信息的场景,可以在类中加入更多内容,比如:
public static class Point {
int x,y,content;
public Point(int x,int y) {
this.x = x;
this.y = y;
this.content = content
}
接下来就是广度搜索的核心代码
定义一个上下左右四方向数组
static int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
//初始化一个队列
Queue<Point> q = new LinkedList<Point>();
//start,end 是搜索的起始点,定义为一个point加入到队列中
q.add(new Point(start,end));
//使用队列是否为空作为判定条件,进行循环直到队列为空。
while(!q.isEmpty()) {
//使用q.poll()把队列的头pop出来,利用它的坐标寻找下一个符合条件的点
Point top = q.poll();
int x = top.x;
int y =top.y;
for(k=0;k<4;k++) {
Point tmp = new Point(x+dir[k][0],y+dir[k][1]);
//safe()判断是否超过边界值,satisfied判断是否满足我们搜索的条件
if(safe(tmp) && satisfied(tmp)) {
q.add(tmp)
}
}
}
就这样一个基本的广度搜索就实现了,有时候需要过滤掉已访问过的点可以用一个boolean的数组标记,或者把访问过的点重新赋值使其不满足条件。
JAVA实现深度搜索
//深度搜索有两种方式,一是递归实现,缺点是递归的共性即数据量大的时候会超时超内存,适用于小数据量的。二是使用数组模拟堆栈进行递归。与广度扩散式的搜索不同,深度是不撞南墙不回头一条道走到黑的方式。
staitic int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
dfs(int x, int y) {
if(safe(x+dir[0][0],y+dir[0][1]))
dfs(x+dir[0][0],y+dir[0][1]);
if(safe(x+dir[1][0],y+dir[1][1]))
dfs(x+dir[1][0],y+dir[1][1]);
if(safe(x+dir[2][0],y+dir[2][1])
dfs(x+dir[2][0],y+dir[2][1]);
if(safe(x+dir[3][0],y+dir[3][1]))
dfs(x+dir[3][0],y+dir[3][1]);
}
为了明显的看出递归的顺序,把它们并列写出来。递归看代码理解不直观,在图上比划一下能明白它的逻辑就容易理解了。
基础算法最重要的就是理解内在的逻辑。