第三单元的作业背景是实现一个社交观关系模拟系统,主要训练了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. react 遍历 object

    @observable obj = { name: "ajanuw", age: 22, }; @computed get list() { return _.toPairs(th ...

  2. socket通信框架——boost asio

    boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...

  3. Hadoop生态常用数据模型

    Hadoop生态常用数据模型 一.TextFile 二.SequenceFile 1.特性 2.存储结构 3.压缩结构与读取过程 4.读写操作 三.Avro 1.特性 2.数据类型 3.avro-to ...

  4. JS输出为[object object]

    问题描述:在控制台打印时应输出对象,但是却输出[object object] 解决办法:先将数据转换为json格式,然后再转换为json对象 JSON.parse(JSON.stringify(use ...

  5. Java常用类:Arrays类

    一.简介 全类名:java.util.Arrays 描述: 此类包含用来操作数组(比如排序和搜索)的各种方法. 此类还包含一个允许将数组作为列表来查看的静态工厂. 注意: 除非特别注明,否则如果指定数 ...

  6. 力扣119. 杨辉三角 II

    原题 1 class Solution: 2 def getRow(self, rowIndex: int) -> List[int]: 3 ans = [1] 4 for i in range ...

  7. 基于Hi3559AV100 RFCN实现细节解析-(2)RFCN数据流分析

    下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: Hi3559AV100的 ...

  8. HDOJ-1560(迭代加深搜索问题)

    DNA sequence HDOJ-1560 *本题是迭代加深搜索问题,主要是要理解题目,题目中一定是有解的,所以为了找最小的解,可以从小的搜索深度开始逐渐增加. *这里有个技巧就是,如果本次指定开始 ...

  9. 从零搭建一个IdentityServer——单页应用身份验证

    上一篇文章我们介绍了Asp.net core中身份验证的相关内容,并通过下图描述了身份验证及授权的流程: 注:改流程图进行过修改,第三方用户名密码登陆后并不是直接获得code/id_token/acc ...

  10. IDEA中便捷内存数据库H2的最简使用方式

    在IDEA中有时候为了练习,需要使用到数据库,但如果自己工作或开发机子上本来没有安装数据库,也没有可用的远程数据库时,我们可以直接在IDEA环境上使用便捷式的内存数据库H2,关于H2更多知识就自己去找 ...