JAVA实现广度搜索&深度搜素
2015-06-16 08:54
399 查看
水两篇数据结构的内容~ ,这几天做了几道算法题。在ACM POJ上广度搜索深度搜素都是比较基础的算法,所以不针对具体的题目了。
先上JAVA版本的广度搜索核心代码:
在这里假设了使用数组,根据数组坐标搜索的场景,如果有其他需要更多信息的场景,可以在类中加入更多内容,比如:
接下来就是广度搜索的核心代码
就这样一个基本的广度搜索就实现了,有时候需要过滤掉已访问过的点可以用一个boolean的数组标记,或者把访问过的点重新赋值使其不满足条件。
JAVA实现深度搜索
为了明显的看出递归的顺序,把它们并列写出来。递归看代码理解不直观,在图上比划一下能明白它的逻辑就容易理解了。
基础算法最重要的就是理解内在的逻辑。
先上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]); }
为了明显的看出递归的顺序,把它们并列写出来。递归看代码理解不直观,在图上比划一下能明白它的逻辑就容易理解了。
基础算法最重要的就是理解内在的逻辑。
相关文章推荐
- eclipse添加视图到常用列表
- MyEclipse6.5 Blue注册码生成器,有效期至2018年
- 开源 java CMS - FreeCMS2.3会员登录
- Java查询大文本文件的处理方法
- Java实验一:编写Rectangle(矩形)类......
- Java基础01——面向对象
- JAVA 面向对象和集合知识点总结
- myeclipse - eclipse 设置自动提示功能
- Spirng第一个程序
- Spring的基本概念
- [Java] Map
- Java Arrays
- Java Enums
- java中读取配置文件
- Java concurrency (multi-threading) - Tutorial
- 我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换
- Split / Partition a collection into smaller collections - Java - Tutorial
- How to implement an ArrayList structure in Java - Tutorial
- How to implement common datastructures (List, Stack, Map) in plain Java - Tutorial
- java中hashcode()和equals()的详解