数据结构实验——JAVA版可视化实现最短路径算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 可视化
说到这里,我有种感觉,可视化学起来相当地费劲,因为组件众多,需要处理的事件 多,函数更是数不胜数,甚至还经常有函数的重载。在这里,我打算分为组件,事件, 布局和绘图三个部分进行简易介绍,然后再说怎么用可视化做这个程序。由于我之前是 从来没用可视化实现数据结构程序的,所以这次感触颇多,我在可视化上面栽的跟头比 算法设计的跟头多好几倍。
如果我想知道 A 到 D 的最短路径,该怎么办呢? 首先是从 A 出发,边 AB 入链表,B 入队列,B 最短距离设置为 27,最短路径是 AB。 接着是从 B 出发,边 BC,BD,BE 入链表,CDE 依次入队列,C 最短距离 45,D 为 70, E 为 53;最短路径是 AB BC,然后看邻接点 E 也在队列里,从 C 走的路距离为 45+22=67, 比 53 大所以不刷新;然后看 D,D 最短路径在 B 的邻接点处理时被设置为 70,发现邻接 点 E 也在队列里,则但是发现从 D 走的路到 E 是 93,所以仍然没法刷新 E 的最短路径。 到了最后大家会知道 A 到 D 的最短路径就是 AD,不信来看。 蓝色标注长度的就是最短路径了:
学生姓名
杭宸
指导教师
黄敏
完成日期 2013 年 7 月 4 日
指导教师对学生在课程设计中的评价
评分项目 课程设计中的创造性成果 学生掌握课程内容的程度 课程设计完成情况 课程设计动手能力 文字表达 学习态度 规范要求 课程设计论文的质量



及格
不及格
指导教师对课程设计的评定意见
综合成绩
指导教师签字
不过要注意的是,在可视化编程的时候,一定要先在 ECLIPSES 下面的小白窗口用 System.out.println(XXX);之类的先输出调试后才,动手做可视化啊,要不然就很难 明白是算法出了问题还是可视化界面设计出问题了。
3 算法在程序中的具体实现过程
说到图,大家都会知道要用到点和边。在我们的课本中,只有顶点表,邻接表或者 邻接矩阵,而且设置带权连通图的时候,对边的操作相当复杂。具体来说,问题如下:
4.1 组件
JTextField 用于编辑文本的框体,只有一行。 可以设置成不能编辑,也可以设置出最大长度。 JTextArea 与 JTextField 不同的是可以多行编辑。 JButton 是按钮组件。 JLabel 是固定的标签,无法编辑,只能显示。 JComBoBox JRadioButton 以及 JCheckBox 都可用于多项选一项,而 JComBoBox 只能 单选,而 JRaidoButton 和 JCheckBox 可多选,用 ButtonGroup 对 JRaidoButton 和 JCheckBox 某些项进行添加可使得在 ButtonGroup 里面的组件只能选一项。 JFrame 是最顶级容器,用于显示和加载各种组件,也可以完成布局。 JPanel 是个次级容器,可添加另外个 JPanel,也可以添加组件和布局,另外还有绘
你是不是发现了一个巧妙的事情呢?没错,在每次处理点的时候,总要把它所有没 放入存储结构的点放入这个存储结构中,这不是很明显的广度优先搜索?对了,这里的 存储结构就是队列了。
那么,让我们来通过我的可视化程序来详细的用例子阐释这个算法吧,如下图所示: 看,这是我们的图(以为长度是自己输入可能很不准确):
画功能。 Box 也是种容器,可以选择排列成平行或者垂直的。以上都是常用的组件。
4.2 事件
事件是可被控件识别的操作,人们通过控件的变化产生相应的事件,而计算机从事 件的判断做出相应的操作。
用得多的事件有 ActionEvent,ItemEvent,MouseEvent,KeyEvent,WindowEvent, MouseMotionEvent 等等。这些事件多来自 java.awt.event*或者是 javax.swing.event* 的 jar 包里面接口。
同样的顶点链表类也用和边链表类这种形式进行处理。 接着就是图类了,最核心的类。首先是设置了邻接表(顶点链表数组),还有顶点表 (顶点数组)、边表(边的链表)、邻接矩阵(double 数组),这些是用于存放图信息的, 无需在不重建图时刷新。另外还有是否在队列(boolean 数组,boolean 类型只有 true 和 false,用于逻辑判断),点的队列(是个链表队列,由于前面介绍了 JAVA 的链表形 式,总共 8 个类,这个队列额外用了队列类和队列节点类,就不介绍了),最短路径表 和最短路径临时储存表(都是边的链表)已经最短距离(就是出发点到所有点的最短路 径长度,自己到自己是 0,是 double 数组)。
再到边链表类,这是很重要的类,图里面的边表、最短路径表和最短路径临时储存 表(用来临时放置各点最短路径,然后从这个表里面找出需要的边放入最短路径表)都 得靠它,用边 第一条边表示了链表的头,当前的边初始值也是表头,后面的就用当前 的边.后一条边来表示其后继。
接着是顶点链表节点类,有当前点的坐标以及从表头代表的点到该点的边长,同样 在类里面设置顶点链表节点类的对象——后继点。
算法文字描述如下: 1.设置一个出发点 A,让 A 入队列,设置 A 的最短距离,入队标记置为 true,把边 放入最短路径临时储存表中。 2.A 出队,把 A 所有未入队列的邻接点放入队列,并设置入队标记和最短距离,设 置最短距离采取抓小放大的策略,既小的保留大的舍弃。如果要更新最短路径临时储存 表,就要用到按终点字符串来进行删除,先删后插。 3.队列如果不是空的出队一个元素 B,让 B 代替 A,重复步骤 2,直至队列已空。 4.从最短路径临时储存表里面按照从终点到起点删边,一边删除,一边插入最短路 径表,这种做法适合于两个链表同端是头插头删,同是尾插头删的用从起点到终点操作。 5.最容易忘记的一个步骤,就是把所用用于临时存放标记的数组链表重新初始化, 否则就会像我一样曾经弄了一个一次性函数,第二次调用这个函数就不行了。
长沙理工大学
《数据结构》课程设计报告
杭宸
学 院 计算机与通信工程 专 业 计算机科学与技术
班 级 计科 11-1
学号
36
学生姓名
杭宸
指导教师
黄敏
课程成绩
完成日期 2013 年 7 月 4 日
课程设计成绩评定
学 院 计算机与通信工程 专 业 计算机科学与技术
班 级 计算机 1101 学 号 201150080136
2 算法的概述
本来,大家都会认为 Dijkstra 算法是用于有向图的,实际上呢,这也可以用于无向 图,因为我们可以把线段 AB 看做既是 A 指向 B 也是 B 指向 A 的有向图。
简单地说,这种算法是将出发点的最短距离看做了 0(因为自身和自身的距离就是 0,无需通过走动就能到达自身),然后将出发点的所有邻接点放入一个存储结构,把这 些邻接点的最短距离置为边的值加上自身的最短路径,某些点被拿出来以后,又会把它 的所有邻接点送入这个存储结构(已经放过的就不放了)再去刷新其他点的最短距离,直 到所有的点都被处理过了,这样从出发点,到所有点的最短距离就求出来了。
1 经常要访问邻接矩阵的很多没用元素 2 传统的邻接表又只有终点的信息且不带长度 3 设置的无限大限制(表示不连通)不够大 4 似乎没有一种结构能够方便地存放最短路径 5 边的个数不确定,用邻接矩阵或者是类数组是很浪费空间的 由于邻接矩阵可能会在以后的程序更新中起到重要作用,所以我没有舍弃,但是在 这个程序中成为了摆设。 为了解决以上多个问题,我决定对传统的图存储结构进行改造,方案如下: 1 给邻接表的节点设置了长度,方便在查找邻接表的时候顺带将长度取出,而邻接 表头节点设置为自己到自己,这样方便知道这是从哪里出发的邻接链表 2 在 JAVA 的 double 类型中,1.0/0.0 是无穷大的合法表示,可以说是 double 里面 最大的数了,有充分理由相信这个权值是普通的图里面最大权值打不到的。 3 直接设置了一个边链表,既可以存放整个图的所有边,不浪费空间,也可以用来 放置最小路径里面的所有边,而且还能够通过一些手段来使得链表里面的最短路径是按 照顺序放置的。 整个程序就有 11 个类,而有 2 个是用于可视化的,1 个是在白窗口里面调试的(和 在 DOS 里面调试类似),剩下的 8 个类是用于构造图并且实现各种功能的下面一一细说。 首先是顶点类,有 String 类型变量设置为点的名字。 接下来是边类,有 String 类型起点和终点的名字,再加上一个 double 的长度,以 及一个用于作为链表连接的边对象——后一条边
平常我们可以在类的内部设置一个事件内部类,也可以直接往组件添加嵌套内部类, 格式比较灵活。简单地说,可以这么做,比如一个 JButton b 要用个 ActionEvent,嵌套 内部类是这么做的:
b.addActionListener(new ActionListener(){/在方法内 public void actionPerformed(ActionEvent e){ ... }
1 引言
本次实验,主要的目的有两个,一是实现图的可视化操作,二是进行最短路径算法 的实践学习。这个算法能够普遍运用于地图查询,工程安排,交通路线规划等许多方面, 可见熟练掌握这种算法是非常重要的。
正因为此次我使用的语言在我们年级中比较罕见,所以会尽可能详细得将代码进行 注释,以便读者理解。
正如大家所知,编程语言有三种重要的思想——面向机器、面向过程和面向对象。 而面向地分析问题,能够把具有相似属性以及相似处理方法的事物归为一类进行操作, 而且能够有继承、重载、覆盖等各类手段,这使得针对某一类对象问题的处理不再单一, 这种思想和人类的自然思想很像,更加容易使人们理解。而 JAVA 的各种强大的 jar 包 蕴含着丰富的类库,比起 C 语言更加容易实现诸如可视化、多媒体文件处理等功能,而 单纯在数据结构与算法分析层面,JAVA 就可以通过在类的内部建立自己的一个对象代替 了指针,有效地避免了函数返回容易出错的问题,而且 JAVA 存在垃圾回收机制,被遗 弃的对象不需要用函数释放空间。在众多理由下,我选择了这个语言进行本次课程设计。
我将会依次介绍算法和可视化两大部分。这么做是为了强调算法的重要性,因为算 法是程序的灵魂,没有好的算法,就难以实现节省空间时间的目的,甚至会使得程序的 结果出错。而且算法比起可视化的操作也好懂些,可视化的操作需要一定的开发经验才 能够明白。
预备知识: JAVA 的类大致如下: public class XXX{ 变量 public XXX(){ 构造函数可以有参也可以无参,也可以重载 } public void(或者变量)(){ }带变量的要返回,没带变量的用 return;是直接挑出函数 } 主函数: public static void main(String args[]){String 是字符串 } 在带有主函数的类中,如果主函数要调用本类的变量或者是其他函数,请在定义时 加上 static,不过构造函数是不能够加 static 的,要注意啊。另外 JAVA 没有友元函数, 而且变量的赋值操作只能写在类的所有方法之前或者方法中,在方法外面不能够定义变 量后另外写赋值(初始化)语句,要把定义和赋值写在一起。
2009 年 9 月 15 日
用 java 的方式实现可视化的 Dijkstra 最短路径算法(无向图)
学生:杭宸来自百度文库指导老师:黄敏
摘要 在这个学期,我学习了数据结构这门课程,正是这门课程让我正真地开始懂得了 一些基础的编程思想,而通过这次的实习我更是成功实现了数据结构可视化,具体化的 想法。在整个学期中,我主要使用面向对象的 JAVA 语言进行编程,深刻地感受到面向 对象的优势,因此在本次试验中,我采用了 JAVA 语言。另外在本次试验的 3 天中,我 走过了不少弯路,不在此一一列举,具体遇到的问题详见正文部分。最后也是真心感谢 各位老师的倾力栽培和对我任性(没用使用大众的 C 语言)的包容。不过有些功能尚未 实现,请老师能够指导。
相关文档
最新文档