OO第三單元作業總結

2022-09-09 07:36:09 字數 2354 閱讀 9689

本單元作業目的是培養jml的閱讀理解能力,以及按照jml描述規格進行架構設計與實現。

要求概述

本次作業下發資料報包括輸入輸出檔案、要求實現的介面檔案和異常類檔案,要求根據介面檔案中的jml描述,實現乙個初步的社交網路模型。

設計本單元作業中jml要求已經給出整體設計思路,我們需要考慮細節的實現,以保證正確性、安全性和時間效率。

容器選用

本次作業中,人的集合、關係集合等可以採用hashmap儲存,以簡化查詢過程中的**量,並有效降低時間複雜度。

需要注意,在刪除人或關係時,需要使用迭代器或remove類方法,以防止異常產生。

演算法選擇

在維護圖的過程中,可以採用並查集,降低查詢連通塊的時間複雜度。

要求概述

本次作業要求增**類的概念,需要實現群類中人的各項權值屬性的統計;同時需要實現傳送、接受訊息等功能。

設計演算法選擇

在統計過程中,需要對群類中人的各項屬性進行預處理,即增加、刪除人或關係的時候,就要對相關群類中的屬性進行修改。這樣可以避免在詢問過程中暴力統計,在詢問密度高的資料中表現出較好的時間效率。

要求概述

本次作業要求增加不同型別的訊息,並實現最短路查詢。

設計容器選用

選用priorityqueue來實現堆,注意過載比較器。

演算法選擇

選用堆優化dijistra演算法計算最短路,時間複雜度$o(nlog_n)$。

junit是一款強大的測試工具,極大簡化了測試過程,方便進行功能覆蓋性測試,可以檢視測試覆蓋**。然而仍需要手動構造特殊測試資料,以保證正確性。

基於jml設計測試而非面向**進行測試,體現了面向需求的思想,測試先於**。

基於jml測試的另一大優勢是方便分功能測試,junit可以對每乙個函式細化測試,有利於細節跟蹤。

列表功能強大,支援快速增刪改查,但是在遍歷過程中不佔優勢,因而本次作業中arrarylist甚少使用。

j**a中的linkedlist是乙個雙向鍊錶。但其實它還有一些其push和pop,可以當成棧來使用,這對於本單元作業中「最近接收到的訊息」功能比較方便。

j**a中的優先順序佇列是二叉小頂堆,方便維護堆優化dijskra。需要注意一些細節:

element()和peek():獲取但不刪除堆頂(隊首)元素。

前者失敗時丟擲異常,後者返回null。

remove()和poll():獲取並刪除隊首元素。

前者失敗時丟擲異常,後者返回null。

是乙個雜湊表,它儲存的內容是鍵值對(key-value)對映。無序的,key不重複的,沒有索引。不能用普通for迴圈來遍歷,需要用迭代器或增強型for。

put本質

首先將k,v封裝到node物件當中(節點)。

第二步它的底層會呼叫k的hashcode()方法得出hash值。

第三步通過雜湊表函式/雜湊演算法,將hash值轉換成陣列的下標

下標位置上如果沒有任何元素,就把node新增到這個位置上。

下標對應的位置上有鍊錶。此時,就會拿著k和鍊錶上每個節點的k進行equal。

如果所有的equals方法返回都是false,那麼這個新的節點將被新增到鍊錶的末尾。

如其中有乙個equals返回了true,那麼這個節點的value將會被覆蓋。

詢問連通性

由於在社交網路中的邊為雙向邊,不存在重邊,因而可以採用並查集維護連通性。在加入人的時候,初始化人的並查集數。加入關係時,判斷兩人是否已經相連。如果不相連則加入同一集合。查詢連通性過程中只需查詢二者的並查集數即可。查詢連通塊數量只需查詢每個人的並查集數是否為改變過即可。

詢問最短路

最短路採用堆優化dijsktra。

詢問群體年齡平均數、方均根、邊權和

不在查詢過程中暴力統計,而是在獨立維護平均數、方均根、邊權和,僅在增、刪過程中進行修改。增刪過程中時間複雜度$o(n)$,查詢過程o(1)

維護可以結合的合併操作。按秩合併可以使得查詢的單次時間複雜度達到$o(logn)$。增加路徑壓縮優化後可以達到均攤效果。

dijsktra演算法時間複雜度為$o(n)$,制約因素在於每次需要尋找最近的點。採用堆來維護距離後,可以在$o(log_2n)$的時間複雜度內查詢最近的點。因此可以達到$o(nlog_2n)$的時間複雜度。

OO第三單元作業總結

在起初剛學習完jml規格語法的時候,由於對jml規格不夠熟練,我選擇了讓自己的 與規格 基本保持一致來完成作業。意思是,jml使用陣列實現,我也會使用陣列實現 jml使用兩層for迴圈實現,我也會使用兩層for迴圈實現。並且,我選擇了每讀乙個方法的jml,就完成乙個方法。顯然,這樣的策略不會讓我產生...

OO第三單元作業總結

前兩次作業由於功能簡單,我自己並沒有自己設計新的類來凸顯層次化,基本上時按照官方給的介面來設計類實現。但是第三次作業,功能越來越多,不進行層次化設計會導致某個類過於複雜 network 因此第三次作業,我將針對同一類物件的操作和該類物件單獨封裝成一類 box類 而network僅僅充當呼叫方和具體實...

OO第三單元總結

一 實現規格的設計策略 1.基於規格,設計方法 大部分需要我們寫的方法,都可以根據規格直接寫出來,這些方法一般都是比較簡單的,比如查詢有沒有這個元素 返回某個元素 增加或刪除某個元素。2.根據規格,了解方法功能,自行設計方法 規格怎麼描述,方法怎麼寫也是可行的,但是了解了方法功能,自行設計會更快,比...