第三单元的作业背景是实现一个社交观关系模拟系统,主要训练了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第三单元——社交网络的更多相关文章

  1. OO第三单元——基于JML的社交网络总结

    OO第三单元--基于JML的社交网络总结 一.JML知识梳理 1)JML的语言基础以及基本语法 JML是用于java程序进行规格化设计的一种表示语言,是一种行为接口规格语言.其为严格的程序设计提供了一 ...

  2. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  3. 规格化设计——OO第三单元总结

    规格化设计--OO第三单元总结 一.JML语言理论基础.应用工具链 1.1 JML语言 ​ JML(java modeling language)是一种描述代码行为的语言,包括前置条件.副作用等等.J ...

  4. 【OO学习】OO第三单元作业总结

    [OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...

  5. OO第三单元(地铁,JML)单元总结

    OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...

  6. OO第三单元作业——魔教规格

    OO第三单元作业--魔教规格 JML的理论基础和相关工具   JML(Java Modeling Language,Java建模语言),在Java代码种增加了一些符号,这些符号用来标志一个方法是干什么 ...

  7. OO第三单元个人总结

    OO第三单元个人总结 JML理论与基础与应用工具链 JML是什么? Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约设计方法 和Larch ...

  8. 2020 OO 第三单元总结 JML语言

    title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...

  9. 2020北航OO第三单元总结

    2020北航OO第三单元总结 本单元要求是根据JML规格完善代码,初看是一个简单的代码照搬实现的东西,但最后才发现由于CPU时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...

随机推荐

  1. Dart http库

    推荐下我写的一个http库ajanuw_http 最基本的获取数据 import 'package:http/http.dart' as http; main(List<String> a ...

  2. Captain technology INC:全球新能源汽车格局突变

    美国能源信息署EIA的统计数据显示,2020年上半年全美含纯电动和插电混动在内的新能源乘用车总销量仅为11.1万辆,同比缩水25%.虽然特斯拉在第三季度靠着13.93万辆的销量迎来了环比387%.同比 ...

  3. [Android 搞机]Twrp 中清除 data 和搞机清除的区别

    近日搞机,用上了 Havoc OS.突然发现设置里有个"加密手机",于是手贱点了进去.手机立刻重启了,然后卡在开机第一屏.遂进 Twrp 高级清除中清除了 data 并重新刷入.重 ...

  4. 从微信小程序到鸿蒙js开发【11】——页面路由

    目录: 1.router.push()&wx.navigateTo() 2.router.replace()&wx.redirectTo() 3.router.back()&w ...

  5. Java进阶专题(二十六) 数据库原理研究与优化

    前言 在一个大数据量的系统中,这些数据的存储.处理.搜索是一个非常棘手的问题. 比如存储问题:单台服务器的存储能力及数据处理能力都是有限的, 因此需要增加服务器, 搭建集群来存储海量数据. 读写性能问 ...

  6. 【秒懂音视频开发】02_Windows开发环境搭建

    音视频开发库的选择 每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如: iOS:AVFoundation.AudioUnit等 Android:MediaPlayer.Med ...

  7. HDOJ-2087(KMP算法)

    剪花布条 HDOJ-2087 本题和hdoj-1686相似,唯一不同的是这里的子串一定要是单独的.所以在确定有多少个子串时不能用前面的方法.而是在循环时,只要找到一个子串,i就不是++,而是+=子串的 ...

  8. 25个关键技术点,带你熟悉Python

    摘要:本文收纳了Python学习者经常使用的库和包,并介绍了Python使用中热门的问题. 01.Python 简介 什么是 Python 一种面向对象的高级动态可解释型脚本语言. Python 解释 ...

  9. 推荐模型AutoRec:原理介绍与TensorFlow2.0实现

    1. 简介 本篇文章先简单介绍论文思路,然后使用Tensoflow2.0.Keras API复现算法部分.包括: 自定义模型 自定义损失函数 自定义评价指标RMSE 就题目而言<AutoRec: ...

  10. 免费报表工具 积木报表(JiMuReport)的安装

    分享一b/s报表工具(服务),积木报表(JiMuReport),张代浩大佬出品. 官网:http://www.jimureport.com/ 离线版官方下载:https://github.com/zh ...