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时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...
随机推荐
- CodeMirror动态修改代码(关键: editor.getDoc().setValue(data); editor.refresh();)
在使用codemirror时,其原理是根据form中的textarea标签,自动加载其内容,获得代码行的显示.(具体使用方式参见 codemirror官网使用手册 http://codemirror. ...
- emplace_back与push_back
资料参考: https://blog.csdn.net/p942005405/article/details/84764104 实际精华在评论中,转载如下: STL的实现版本很多,VS.GCC版本不同 ...
- Scrapy项目_阳光热线问政平台
目的: 爬取阳光热线问政平台问题中每个帖子的标题.详情URL.详情内容.图片以及发布时间 步骤: 1.创建爬虫项目 1 scrapy startproject yangguang 2 cd yangg ...
- 鸿蒙的js开发部模式16:鸿蒙布局Grid网格布局的应用一
鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口]目录:1.Grid简介2.使用Grid布局实现的效果3.grid-row-gap和grid-colunm-gap属性4.< ...
- 如何使用irealtime.js实现一个基于websocket的同步画板
同步画板演示 同时打开2个tab,分别在画布上写下任意内容,观察演示结果,同时可设置画笔颜色及线条宽度.演示地址 初始化画布 <canvas id="drawBoard" w ...
- Linux 查看磁盘是否为SSD
第一步,找到磁盘 ll /dev/sd* ll /dev/vd* 第二步,查对应磁盘类型 cat /sys/block/sda/queue/rotational 结果: 返回0:SSD盘 返回1: ...
- Go的switch
目录 go的switch 一.语法 二.默认情况 三.多表达式判断 四.无表达式 五.Fallthrough go的switch switch 是一个条件语句,用于多条件匹配,可以替换多个if els ...
- 求幂&&快速幂&&位运算
1.普通的求幂方法: 时间复杂度为O(n),对于比较大的数在1s限时内可能会TLE int pow(int base,int p){ int ans=1; for(int i=1;i<=p;i+ ...
- Django-1.11中文文档——操作关联对象
关联对象参考 写在最前面--基础示例模型如下: from django.db import models class Blog(models.Model): name = models.CharFie ...
- Pyqt5——变色的表格
需求:鼠标左键点击表格后,对应的单元格背景颜色发生变化. 实现:(1)使用Qt的model-view模式生成表格视图. (2)重写表格的点击事件. (3)设置表格的背景颜色. 正常情况下,当用户选中单 ...