oo——第三单元总结

 

前言

        第三单元是咱们学习oo以来第一次接触JML。这一单元的三次做业和之前同样,采用了难度递进的方式,并且前一次做业的设计思路在下一次做业都多多少少有些体现(或者说是在其基础上作出的改进)。并且本单元做业在理解了JML的基础上来作,实现起来并不困难,难点在于如何提升本身代码的性能。本文分为四个部分:首先是JML语法基础;个人设计架构以及性能优化;debug以及测试样例的自动生成;心得体会。java

JML语法基础

        首先简要介绍一下JML语法基础。算法

        JML以javadoc注释的方式来表示规格,每行都以@起头。有两种注释方式,行注释和块注释。其中行注释的表示方式 为 //@annotation ,块注释的方式为 /* @ annotation @*/。JML的表达式是对Java表达式的扩展,新增了一些操做符和表达式。其中,新增的一些表达式分为原子表达式和量化表达式。原子表达式有:\result表达式,表示一个非 void 类型的方法执行所得到的结果,即方法执行后的返回值;\old( expr )表达式,用来表示一个表达式 expr 在相应方法执行前的取值,以及\not_assigned(x,y,...)表达式等。量化表达式有\forall表达式、\exists表达式、\sum表达式、\product表达式、\max表达式、\min表达式等。新增的操做符有:子类型关系操做符,等价关系操做符和变量引用操做符。除此以外,方法规格是JML的重要内容。方法规格的核心内容包括 三个方面,前置条件、后置条件和反作用约定。其中前置条件是对方法输入参数的限制,若是不知足前置条件,方法 执行结果不可预测,或者说不保证方法执行结果的正确性;后置条件是对方法执行结果的限制,若是执行结果知足后 置条件,则表示方法执行正确,不然执行错误。反作用指方法在执行过程当中对输入对象或 this 对象进行了修改(对 其成员变量进行了赋值,或者调用其修改方法)。性能优化

设计架构以及性能优化

        第一次做业内容比较简单,主要目的是为了让咱们熟悉JML语法,在此不作过多分析。这里分析一下第二第三次做业。bash

        第二次做业在第一次做业的基础上,引入了一些图论的知识。在实现时,因为指导书给出了明确的指示——PATH_ADD和PATH_REMOVE不超过20条。出于这一点考虑,我把第二次做业涉及的最短路径的运算分散到了每个PATH_ADD和REMOVE,就是每一次增删路径,都会对任意两点之间的最短路径进行从新运算并保存(听起来彷佛很浪费,可是有20条指令限制的保护,起码能够保证不超时)。这样,在要用最短路径的时候,直接取用就行了。第三次做业就是在第二次做业的基础上加入了换乘的概念。但就是加入这一简单的概念,让整个问题复杂了许多。在解决这一问题时,我没有找到太好的解决办法,采用了拆点的方式来解决换乘。基本思路就是,不一样path上的相同点在计算最低票价和最低不满意度时视为不一样的点。(最低票价和最低不满意度都用迪杰特斯拉算法,看成最短路径来算,权值不一样而已)架构

       整体架构上,我除了题目要讲求的两个类以外,还单独加入了一个类,用来封装关于图的操做,好比每次加入新的path,都要存储和更新以前存储的任意两点之间的最短路径,最低票价,最低不满意度,最少换乘次数等。这些量各自都用一个图来存储,我把这些图,以及对这些图的操做都放在这个类里(所有都用静态变量和静态方法),每次要用到,或者要更新时,就访问这个类。性能

心得体会

       这一单元让我感触最大的,是hash表的神奇之处——他可以将一段时间复杂度为o(n)甚至更多的遍历,改变成时间复杂度为o(1)的遍历。由于在此次做业以前,我没怎么遇到过程序运行时间上限的要求,因此在这以前,我通常都是选用ARRILIST来解决这一类的问题,可是ARRILIST只要是须要遍历一次,就有o(n)的时间复杂度,一旦出现嵌套遍历的状况,就会出现o(n)以上的时间复杂度。然而,hashmap就不存在这种问题了,由于它是经过hash值做为key值,用所在类的hashcode方法来计算相应的value值存储位置,时间复杂度为o(1)。并且,hashmap还有一个好处就是,他存储的不止是一个值,而是一对键值对,这样一对相互关联的值实际上都存储在了hashmap,好比path和pathid,就能够用pathid做为键值来存储path(整型类的hashcode是已经写好的不用重写,比较方便),这样一来,path和pathid都被存储了。学习

bug分析以及测试数据的自动生成

dubug测试

        本单元做业还有一个难点,那就是debug,尤为是强测互测以后,那些强侧和互测的数据你根本看不出来什么(太多了),因此我以往面向评测机debug的方法已经再也不实用,由于每一个bug都至关于一个前两单元中测没有返回信息的点!优化

JMLUnitui

 

package demo;
 
public class Demo {
     /*@ public normal_behaviour
       @ ensures \result >= num1;
       @ ensures \result >= num2;
       @ ensures \result >= num3;
     */
     public static int compare( int num1, int num2, int num3) { 
         int max;
         if (num1 > num2) {
             max = num1;
         }
         else {
             max = num2;
         }
         if (max < num3) {
             max = num3;
         }
         return max;
     }
 

 

     public static void main(String[] args) {
         compare( 114 , 1919 , 1111 );
     }
}

 

 执行javac -cp jmlunitng-1_4.jar运行测试文件获得的结果是:

 

[TestNG] Running:
   Command line suite
 
Failed: racEnabled()
Passed: constructor Demo()
Passed: static compare(- 2147483648 , - 2147483648 , - 2147483648 )
Passed: static compare( 0 , - 2147483648 , - 2147483648 )
Passed: static compare( 2147483647 , - 2147483648 , - 2147483648 )
Passed: static compare(- 2147483648 , 0 , - 2147483648 )
Passed: static compare( 0 , 0 , - 2147483648 )
Passed: static compare( 2147483647 , 0 , - 2147483648 )
Passed: static compare(- 2147483648 , 2147483647 , - 2147483648 )
Passed: static compare( 0 , 2147483647 , - 2147483648 )
Passed: static compare( 2147483647 , 2147483647 , - 2147483648 )
Passed: static compare(- 2147483648 , - 2147483648 , 0 )
Passed: static compare( 0 , - 2147483648 , 0 )
Passed: static compare( 2147483647 , - 2147483648 , 0 )
Passed: static compare(- 2147483648 , 0 , 0 )
Passed: static compare( 0 , 0 , 0 )
Passed: static compare( 2147483647 , 0 , 0 )
Passed: static compare(- 2147483648 , 2147483647 , 0 )
Passed: static compare( 0 , 2147483647 , 0 )
Passed: static compare( 2147483647 , 2147483647 , 0 )
Passed: static compare(- 2147483648 , - 2147483648 , 2147483647 )
Passed: static compare( 0 , - 2147483648 , 2147483647 )
Passed: static compare( 2147483647 , - 2147483648 , 2147483647 )
Passed: static compare(- 2147483648 , 0 , 2147483647 )
Passed: static compare( 0 , 0 , 2147483647 )
Passed: static compare( 2147483647 , 0 , 2147483647 )
Passed: static compare(- 2147483648 , 2147483647 , 2147483647 )
Passed: static compare( 0 , 2147483647 , 2147483647 )
Passed: static compare( 2147483647 , 2147483647 , 2147483647 )
Passed: static main( null )
Passed: static main({})
 
===============================================
Command line suite
Total tests run: 31 , Failures: 1 , Skips: 0
===============================================
相关文章
相关标签/搜索