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
===============================================
相關文章
相關標籤/搜索