oo第三单元——社交网络
第三单元的作业背景是实现一个社交观关系模拟系统,主要训练了JML的阅读和理解能力,和图的一些数据结构和算法。
JML语言的理论基础
JML相对于实现代码是比较抽象的,规定了方法的前提副作用结果、数据的约束等,相当于搭建了一个框架,我们这个单元做的就是根据规格补充代码,实现规格定义的功能。
方法规格主要是看懂前置条件、后置条件和副作用,将前置条件和后置条件对应起来,有时还需要抛出异常,注意if-else的包含关系可能在写代码的过程中出错,特别注意副作用,副作用中没有提到的变量是不能改变,即使不影响这个方法的结果。
数据规格是对类中的数据进行一定的限制,有不变式和约束。两者都是可见条件下的约束,意思是强调调用方法的开始和结束状态,而在方法执行过程中可以短暂改变。不变式和约束的区别是不变式限制的是数据的状态,约束是限制的是数据变化时的状态。
JML应用工具链
OpenJML:可以检查写的JML规格的格式,也可以对内容进行简略的检查。
下载完openjml.jar包后,新建一个test文件夹,将所要测试的文件放入文件夹中,在命令行中执行指令
java -jar openjml.jar te/test.java
如果有语法错误会报错

JMLUnitNG:自动生成测试程序
下载jmlunitng.jar包,保证jdk1.8,将待测试的java文件放入,依次执行下面的指令
java -jar jmlunitng.jar test/MyGroup.java
javac -cp jmlunitng.jar test/*.java
java -jar openjml.jar -rac test/MyGroup.java
java -cp jmlunitng.jar test.MyGroup_JML_Test
结果很奇怪的报错

测试了一个简单的java文件,结果如下
作业架构设计
本次左右的基本架构都由JML通过接口的方式给出,需要自己编写相应的类,要做的工作有选择合适的容器,实现方法,重点是图的算法。第二次和第三次作业还需要考虑性能。
第一次作业是Runnr根据输入的指令调用NetWork的相关方法,Network中根据需要调用Person的方法。由于第一次作业中没有性能的要求,我选择的是比较常用的ArrayList容器。

这次作业有关图的部分使用的邻接表和dfs
这次作业在强测和互测中均未发现bug
第二次作业新增了Group类,也新增了对性能的要求。我在MyGroup中对sum(age)和sum(age2)做了缓存处理,在 getRelationSum和getValueSum中利用对称性化简了遍历的过程。考虑到递归深度可能会比较大,可能会发生爆栈,所以把dfs算法替换成bfs算法。

第二次作业因为强测中太多超时了没有进入互测。发现有很多地方可以优化,当需要在数组里查找一个元素的时候,ArrayList只能遍历,效率太低,HashMap或者HashSet容器利用Hashcode查找,不用遍历,效率会提高很多。getRelationSum和getValueSum即使做了优化也需要二重遍历,所以也应该设置缓存。
第三次作业新增了一些图类的算法,在最短路径中我是用的是dijkstra算法,并且使用了堆优化,利用了PriorityQueue这个容器。在强连接中我先用Tanjar找到图中的割边,然后去掉割边后利用bfs算法再次寻找两个点是否联通。在qeryBlockSum中我没有用查集算法,也是用的bfs算法,一次bfs查询到的节点都属于一个block,没有查询到的一定不属于这个block。

这次作业在强测中关于最短路径的测试点都超了时,在bug修复时发现
心得体会
根据JML写规格需要灵活处理,因为JML相对来说形式非常固定,但是实现的时候java语言给我们提供了很多方式的实现方法,比如在数组中查找元素的时候,JML中只能用 exist 或者 forall 来实现,一开始接触JML的时候惯性思维让我在代码实现的过程中也使用这样遍历的方式来实现,直到第二次作业中在性能方面效率太低才想起来使用Hashcode查找效率很高。所以虽然JML给出了一定的实现思路,但是不一定是最好的,写代码的时候或者写完代码应该思考一下怎样利用Java强大的包进行优化。
这次作业对图的要求比较高,用到了很多算法,像dijkstra,bfs,dfs等之前数据结构课学习过,但是也有像Tarjan、堆优化、并查集等之前没有接触过,需要自己搜索资料。通过这个单元的作业,我感觉培养自己上网搜索资料,并且把资料理解学习后能快速的转化为自己的思路,能够在代码中实现的能力很重要。在日后会遇到更多的算法,更多老师没有讲过的或者之前没有学习过的,所以快速的自学和应用能力很重要。
oo第三单元——社交网络的更多相关文章
- OO第三单元——基于JML的社交网络总结
OO第三单元--基于JML的社交网络总结 一.JML知识梳理 1)JML的语言基础以及基本语法 JML是用于java程序进行规格化设计的一种表示语言,是一种行为接口规格语言.其为严格的程序设计提供了一 ...
- OO第三单元作业总结
OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...
- 规格化设计——OO第三单元总结
规格化设计--OO第三单元总结 一.JML语言理论基础.应用工具链 1.1 JML语言 JML(java modeling language)是一种描述代码行为的语言,包括前置条件.副作用等等.J ...
- 【OO学习】OO第三单元作业总结
[OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...
- OO第三单元(地铁,JML)单元总结
OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...
- OO第三单元作业——魔教规格
OO第三单元作业--魔教规格 JML的理论基础和相关工具 JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...
- OO第三单元个人总结
OO第三单元个人总结 JML理论与基础与应用工具链 JML是什么? Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约设计方法 和Larch ...
- 2020 OO 第三单元总结 JML语言
title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...
- 2020北航OO第三单元总结
2020北航OO第三单元总结 本单元要求是根据JML规格完善代码,初看是一个简单的代码照搬实现的东西,但最后才发现由于CPU时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...
随机推荐
- c++ 动态解析PE导出表
测试环境是x86 main #include <iostream> #include <Windows.h> #include <TlHelp32.h> #incl ...
- NGK公链依靠技术创新推动数字经济产业发展
数字经济更让人们的生活发生了翻天覆地的变化.数字经济的发展要依靠技术的创新,发展出生态新模式.同时数字经济的发展要利用新技术对传统产业进行全面的的改造升级,释放数字对经济发展的放大.倍增作用.打造数字 ...
- Windows Server2012 r2 nginx反向代理图片服务器
1.下载nginx http://nginx.org/en/download.html,本人下载的1.18.0版本 2.下载 Windows Service Wrapper(winsw.exe) v ...
- 看完了进程同步与互斥机制,我终于彻底理解了 PV 操作
尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...
- 基于μcOS-II实时操作系统源码实现RMS和EDF调度(共享资源)
μcOS-II多任务实验报告(RMS.EDF调度) 目录 μcOS-II多任务实验报告(RMS.EDF调度) 一.实验概述 二.环境搭建 三.代码分析 四.实验步骤 1 给TCB块添加扩展 2 创建并 ...
- join为啥会阻塞主线程?
join使用 上篇我们介绍了CountDownLatch,顺便说到了Thread中的join方法! import java.util.concurrent.TimeUnit; /** * @autho ...
- 100道Java高频面试题(阿里面试官整理)
我分享文章的时候,有个读者回复说他去年就关注了我的微信公众号,打算看完我的所有文章,然后去面试,结果我后来很长时间不更新了...所以为了弥补一直等我的娃儿们,给大家的金三银四准备了100道花时间准备的 ...
- SSRF攻击原理
目录 什么是SSRF 原理 防护 什么是SSRF 一个对外的Web接口,改接口能让用户控制curl命令,去访问别的web服务. 简图如下 想象一下当用户请求的baidu.com/x.php?image ...
- 如何理解JavaScript中的函数
转: 如何理解JavaScript中的函数 JS中的函数简介 JS中的函数是一种通过调用来完成具体业务的一段代码块.最核心的目的是将可重复执行的操作进行封装,然后供调用方无限制的调用. JS中的函数的 ...
- Java实现贪吃蛇
游戏界面基本布局 贪吃蛇是基于JFrame的一款小游戏.它主要有两部分组成,一个是显示区域,一个是按钮区域.这两个区域都用JPanel来实现. 首先需要创建一个基于JFrame的类,例如创建一个MyF ...