JAVA实现广度搜索&深度搜素

来源:互联网 发布:java redis是什么 编辑:程序博客网 时间:2024/06/05 05:19

水两篇数据结构的内容~ ,这几天做了几道算法题。在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]);}

为了明显的看出递归的顺序,把它们并列写出来。递归看代码理解不直观,在图上比划一下能明白它的逻辑就容易理解了。

基础算法最重要的就是理解内在的逻辑。

0 0
原创粉丝点击