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时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...
随机推荐
- regex read once bug
regex read once bug read once bug StackOverflow Question https://stackoverflow.com/questions/5916796 ...
- InnoDB 的记录结构和页结构
本文转载自InnoDB 的记录结构和页结构 概述 InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,中页的大小一般为16KB.也就是在一般情况下,一次最少从磁盘中读取16KB的内 ...
- 鸿蒙js开发7 鸿蒙分组列表和弹出menu菜单
鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口]目录:1.鸿蒙视图效果2.js业务数据和事件3.页面视图代码4.跳转页面后的视图层5.js业务逻辑部分6.<鸿蒙js开发& ...
- WPF 数据绑定实例一
前言: 数据绑定的基本步骤: (1)先声明一个类及其属性 (2)初始化类赋值 (3)在C#代码中把控件DataContext=对象: (4)在界面设计里,控件给要绑定的属性{Binding 绑定类的属 ...
- Windows定时重新启动(适用于server 2012 r2)
直接看链接吧:https://jingyan.baidu.com/article/2d5afd69dd8e9d85a2e28eb7.html 开始菜单,找到"计划任务程序"; 2 ...
- Jump Server在docker中安装部署
安装部署: 1.准备机器: 官方环境要求: 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低) 操作系统: Linux 发行版 x86_64 Python = 3.6.x Mysql S ...
- ctf.show_web13(文件上传之.user.ini)
这是一道文件上传题,先二话不说丢个图片码,显示为 先考虑文件太小,用burp抓包,添加了一堆无用的东西后显示仍然是error file zise,直到上传正常图片依旧如此,考虑文件太大.将一句话木马修 ...
- 安鸾渗透实战平台-PHP代码练习
0x00 前言 --工欲善其事,必先利其器 0x01 代码理解 (1)linux命令 pwd 查看当前工作目录的完整路径 cd / 切换到根目录 ls / 查看根目录下的所有目录和文件 cat /[f ...
- 手把手教你Spring Boot2.x整合kafka
首先得自己搭建一个kafka,搭建教程请自行百度,本人是使用docker搭建了一个单机版的zookeeper+kafka作为演示,文末会有完整代码包提供给大家下载参考 废话不多说,教程开始 一.老规矩 ...
- 微信小程序自定义头部导航栏
<!--index.wxml--> <view> <navbar id='index_header' background='{{background}}' pageNa ...