競程日記 - 資料結構篇
大家好我是卡編這樣。2016 年 9 月我們決定以資料結構的各種介紹與實作作為這個新學期、新賽季的開始。大家一起加油吧!
這裡的文章會是以主題式地蒐集各種競賽中常見的資料結構問題喔~ 在這些文章中,我們期望做到「沒有太多驚訝」、「沒有太多疑問」以及「沒有太多模糊的解釋」三大原則,讓大家可以瞭解每一個資料結構的特性,以及一些實戰應用的例子。
之後應該會把這些內容寫進書裡吧~如果有出書的那一天的話(笑)
老話一百句,歡迎大家投稿、推薦題目、指出錯誤與建議修正項目喔!希望能夠集結大家的熱情,讓競賽程式解題的社群能有更多的討論題材~(如果您希望擁有編輯權限的話,還請直接敲卡編這樣~)
特別感謝
特別感謝日月卦長的協助!
請參考日月卦長的模板庫
0 關於資料結構
0.1 什麼是資料結構?
顧名思義,資料結構就是一種資料儲存的方式,目的在於能夠讓資料被有效率地運用。通常我們想要使用或設計一個資料結構時,首要任務必須先理解資料會如何被使用,才能有效地設計與實作出高效能的資料結構。
0.2 資料結構與演算法有什麼不同?
演算法無所不在,資料結構的操作裡頭也滿滿的都是演算法。資料結構和演算法這兩種東西是相輔相成的。比起演算法來說,資料結構更像是對資料存儲與更新嚴謹定義出來的 API,它提供了一些接口給上層的演算法使用、還可以有效率地實作出定義好的操作需求。
0.3 競賽上常說的資料結構問題是什麼?
- 有很明顯地演算法、但是需要設計有效率的資料結構。
- 利用資料結構的輔助,可以輕鬆完成的題目。
0.4 我們會討論哪些東西?
可以廣泛應用、在比賽中能夠有所運用與表現的資料結構。
0.5 這次我們傾向於不會討論哪些東西?
這些專門的東西應該要留給獨自的章節,細細品味才是。
- 動態規劃的資料結構優化(偶爾會提到啦,不過主軸如果是動態規劃傾向不提)
- 專門用在圖論上的資料結構(偶爾會提到啦,不過會把圖論的部份當做應用,例如最短路徑、網路流、帶權匹配等)
- 字串處理相關的資料結構(比方說後綴樹、後綴數組、後綴自動機等)
- 與機器規格相關的資料結構(比方說無視快取資料結構 Cache Oblivious Data Structures 等)
- 計算幾何等相關資料結構