本單元的作業是根據jml規格,實現社交關係模擬系統,難度相比第二單元下降了很多,但是我的得分情況卻差了很多,主要原因是本地沒有充分測試。
本單元的**只需要按照jml的規格實現方法就行,我在剛開始寫的時候,按照指導書中每個類出現的順序來填充他們的方法,而沒有從整體上觀察我們需要實現什麼功能,只是盲目地翻譯了jml。雖然這樣只要每個方法的實現正確,最後就能保證結果的正確性,但是效能上非常糟糕。例如沒有選擇合適的容器,也沒有引入任何中間變數來降低時間複雜度。
在完成後兩次作業時,我選擇了先整體瀏覽一遍,按功能確定完成順序,例如network留至最後完成,先實現異常處理再完成正常情況處理等。
本單元可以採取對拍的方法測試,生成測試資料對比不同人的輸出。但是由於時間問題,還沒有學會寫測試工具的我直接看**從邏輯上驗證正確性。
其實本單元的正確性相對容易保證,但是我的後兩次作業強測均出現了正確性問題。
第二次作業是因為算方差時沒有除以總人數(看jml看的眼花了),僅得10分,其實在閱讀規格時仔細一點就不會出這種問題。
第三次作業是發紅包訊息時沒有減person1的money。(看jml的時候看序列了)
這單元的我出現的bug基本都屬於直接肉眼看**就能看出來的,但是因為自己沒有測試,所以犯了很多致命的導致結果全錯的bug(好處大概是很好修?基本3行內就修完了)。
第一次作業剛開始時,我全部採用了arraylist,很多方法的實現也是遍歷和迴圈,效率非常低下。arraylist換乘hashmap後根據id查詢person或message的複雜度變為o(1)。
iscircle方法判斷是否連通時學習了並查集的方法,每次新增關係時更新根節點,並進行路徑壓縮,相比之前用深搜時間複雜度降低了。
querynamerank方法查詢當前名字排序位置起初是遍歷計算排序,後來改為字典樹統計,每個結點記錄以當前結點為終點的個數、經過該結點的次數和所有子結點資訊。
平均年齡和方差的計算,第二次作業強測前,每次求平均值時我都要遍歷一遍,導致ctle了,修復bug時增加中間變數agesum
儲存年齡總和,在加人或刪人時更新。求方差時本打算引入中間變數記錄平方和,然後利用\(e(x^2)-e(x)^2\)計算方差,但是由於int相除時取整損失精度的問題,這樣算出來結果和答案不一樣。最後我還是沒能找到取整後一樣的演算法,回到了遍歷求方差。
最短路徑演算法採用了dijkstra演算法,又學習了堆優化後的dijkstra,不過強測還是ctle了。試圖增加一些中間變數優化演算法,但是沒有維護好正確性反而缺失了,暫時還停留在ctle的版本。
本單元實現的社交網路系統中,以person
為結點,以是否認識的關係構建邊,認識則有邊,邊賦予權重value
,連通的兩個結點可以傳送訊息,person
也可以給乙個包含多個person
的group
傳送訊息。
NOI模擬(5 3) CQOID1T2 社交網路
社交網路 題目背景 5.3 模擬cqoi2018d1t2 分析 矩陣樹定理 求有向圖的有根樹形圖,顯然對於有根的樹形圖是可以直接用矩陣樹定理的,那麼直接建出入度矩陣和鄰接表矩陣,入度矩陣 鄰接表矩陣獲得基爾霍夫矩陣。直接去掉 1號點所在行列直接求就可以了。複雜度 o n3 source create...
CSP3 模擬總結
這道題目在考試中是沒有做出來的,感覺自己的思維水平還是差一些,對於這道題而言,對於一些規則的理論性的演算法考察的並不多,主要是乙個思維上的擴散,總體來說自己在做題過程中有些思維固化。一開始見到這個題目的時候,感覺這是一道dp問題,但嘗試了很多,總是有漏洞存在,於是便採用了一種暴力的n2的方法,但顯然...
網路程式設計總結 3
iphone的cfnetwork程式設計比較艱深。我選擇使用asyncsocket開源庫來開發,下面介紹一些簡單的使用,並給出我寫的乙個簡單的實現模板,只要新增自己的處理 就可以使用了。官方 一.專案新增asyncsocket 2.把asyncsocket庫原始碼加入專案 3.在專案增加cfnetw...