2021 物件導向設計與構造 第三單元總結

2022-09-09 07:33:09 字數 3241 閱讀 4002

架構上,完全照搬給出的介面,對於每乙個介面 (或異常抽象類)a建立了mya將其實現 (或繼承)。

三次作業都是這麼做的,因此不在後兩次作業中進行贅述了。

絕大部分方法只需複製規格,異常類的實現使用static成員變數記錄每個id的出現次數即可。

三次作業異常類大致相同,因此不在後兩次作業中進行贅述了。

無向圖中新增點、新增邊、查詢任意兩點間是否連通、查詢連通塊數量,可以使用路徑壓縮+啟發式合併的並查集,單次操作 \(o(\alpha(n))\) 或 \(o(1)\) 的複雜度內完成。

查詢name的排名直接複製規格進行暴力,單次複雜度不超過 \(o(|s|n)\),其中 \(|s|\) 是串長。寫平衡樹可以優化到 \(o(|s| \log n)\),但這麼小資料範圍根本沒必要。

因為功能過於簡單,主要採用隨機生成資料和室友對拍的方法。同時構造了一些極端資料防止演算法寫假。

強測與互測中沒有出現 bug,互測中主要採取看**+構造的方法 hack 了 \(3\) 個人,hack 內容見下面的效能分析。

mynetwork中使用hashmap儲存每個person,以及並查集中的fa陣列與siz陣列,鍵均為id

myperson中使用hashmap儲存邊的權值,鍵為id

異常類中使用hashmap儲存每個id的出現次數,鍵為id

我的實現中,複雜度瓶頸在於查詢name的排名。

此外,查詢連通塊數量的jml規格是以 \(o(n^2)\) 次呼叫iscircle方法給出的,如果直接照搬規格,iscircle的實現又比較慢,就可以被卡成 tle,互測中也是根據這個問題進行 hack。

架構上,完全照搬給出的介面,對於每乙個介面 (或異常抽象類)a建立了mya將其實現 (或繼承)。

對於groupvaluesum,每次新增person或刪除person時維護改變量,單次修改複雜度 \(o(n)\),單次查詢複雜度 \(o(1)\)。

對於groupagemeanagevar,通過維護age的和與平方和可以做到單次 \(o(1)\) 詢問與修改,但是這並不是複雜度瓶頸,索性直接 \(o(n)\) 暴力。

剩下的方法就沒有什麼優化餘地了,直接照搬規格即可。

需要注意的是以下兩個坑:

因為功能過於簡單,主要採用隨機生成資料和室友對拍的方法。同時構造了一些極端資料防止演算法寫假。

強測與互測中沒有出現 bug,互測中主要採取看**+構造的方法 hack 了 \(2\) 個人,hack 內容見下面的效能分析。

組內另有一人使用了arraylist而非hashmap,看**時完全忽略,沒有針對其進行構造,錯失了這個機會。

mynetwork中使用hashmap儲存每個groupmessage,鍵值為對應id

myperson中使用arraylist儲存他收到的資訊。

mygroup中使用hashmap儲存其中的person,鍵值為id

group中查詢valuesumjml規格是以 \(o(n^2)\) 次呼叫islinked方法給出的,如果直接照搬規格,可以被卡成 \(o(n^3)\) 從而造成 tle,互測中也是根據這個問題進行 hack。

架構上,完全照搬給出的介面,對於每乙個介面 (或異常抽象類)a建立了mya將其實現 (或繼承)。

除了最短路,其它部分的規格都是單純模擬,沒有優化餘地。

對於無負邊權的單源最短路,使用優先佇列實現的堆優化 dijkstra 演算法可以在 \(o(m \log m)\) 的複雜度內完成。

因為功能過於簡單,主要採用隨機生成資料和室友對拍的方法。同時構造了一些極端資料防止演算法寫假。

強測與互測中沒有出現 bug,互測中主要採取看**+構造的方法進行 hack,但大家寫的都很對,因此沒有 hack 成功。

mynetwork中使用hashmap實現規格中的emojiheatlist

mynetwork中利用priorityqueue實現了堆優化 dijkstra 演算法。

在本題的資料範圍和 \(6\) 秒時限下,單次最短路詢問 \(o(m \log m)\) 是可以通過的。

不過,需要注意 dijkstra 的暴力演算法並非毫無用途,其複雜度為 \(o(n^2)\),在稠密圖上快於堆優化,例如這個題 cf1528d。

感謝課程組為我們減負,三次作業簡直是從頭暴力到尾,老爽了。當然,乙個缺點就是寫部落格不知道寫啥,理論課上老師說要我們多寫點兒,但是我覺得真的沒啥好寫的,如果助教審閱時覺得字數太少我可以再水一些(逃。

j**a8 的hashmap非常人性化,當乙個雜湊值的元素過多時會將鍊錶轉化為紅黑樹,元素過少時又會將紅黑樹轉化為鍊錶,降低了雜湊衝突的代價,也讓我斷絕了我卡雜湊的想法。

理論課上老師多次提出:「形式化方法工程應用受限。」

這三次作業讓我深刻體會到了這一點。一些方法寥寥幾行就能寫完,形式化規格卻要寫的特別臃腫冗長。如果說這麼做的代價是能進行形式化驗證,那麼意味著可以做到嚴格意義上的無 bug,簡直再好不過了。但是現實是還需要自己造資料進行測試,那「形式化」就會成為效率的阻礙。

希望以後能看到形式化驗證在工程上廣泛應用的那一天,這樣就再也不用擔心沒找出來的 bug 了。

物件導向程式設計與構造第三單元總結

本次作業是我第一次接觸jml規格,初次接觸規格帶給我的感受和第一次作業初次使用j a以及面對電梯第一次感受多執行緒好太多太多了。理解jml語言的過程並沒有帶給我什麼煩惱,不過接觸規格之後確實讓我對我的程式設計學習有了乙個新的認識。第一次看到規格之後我想的是,這個東西有什麼用嗎?我們明明可以用很簡潔的...

物件導向分析與設計(三)

部落格班級 作業要求 homework 11620 作業目標 掌握用例圖 類圖 活 順序圖的畫法 學號3190704105 一.實驗目的 1 了解基於uml的物件導向分析與設計方法 2 掌握用例圖的繪製 用例規約 文件 的編制 3 掌握類圖 活 狀態圖 時序圖的繪製方法 二 實驗內容 繪製大學教師選...

java物件導向 三 構造方法

先觀察如下格式 類名稱 物件名稱 new 類名稱 上述格式為宣告並例項化乙個類的物件,其解釋如下 類名稱 要定義物件的資料型別 物件名稱 日後進行類屬性或方法操作的標記變數 new 開闢堆記憶體空間 類名稱 例項化物件,屬於方法,即在類中提供乙個和類名稱相同的方法,此處實際上就表示了類中的構造方法,...