我的水平所限,只能談及幾年前的OI省選水平的算法。再高深的,便不清楚了。html
聲明:算法分類方式與列舉順序借鑑於hzwer同窗的《OI省選算法彙總》。算法
OI算法,大抵可分爲如下幾類:數組
- 數據結構
- 字符串相關
- 圖論相關
- 數學相關
- 動態規劃
- 計算幾何
- 搜索相關
- 不保證正確性的算法
- 其餘重要工具與方法
下面依次談一談。數據結構
數據結構
對數據結構的理解,每每隨着接觸愈發深刻。大體會是這樣的歷程——dom
- 知道的很少,關注如何實現,實現能力較差
- 會超過十個,關注如何選取,實現愈發純熟
- 能聯繫起來,關注如何組合,實現基本無誤
- 後面的我也不知道了……
首先必須掃盲一下,按我這種分法,OI的完整數據結構歷程怎麼也得十步以上。隨便一個省隊隊員,基本都已經超越了我說的這三個階段。然而,實際工程中,普通工程師們對數據結構的理解卻很淺,平衡樹都不必定寫過,可並堆甚至都沒據說過。可這並不說明實際工程不須要對數據結構的理解,只能說明廣泛水平低。也正所以,我才能在這裏寫點東西,糊弄一下不搞OI的人。工具
我大概到了第三階段的初期,實現基本無誤,開始關注如何組合了。雖然實際工程中依舊會偶爾遇到本身並不瞭解的數據結構。但這每每並不會阻礙我,畢竟工程中的數據結構並不像OI那麼高深,藉助本身對數據結構的理解,每每能夠很快理解並實現一個從未見過的數據結構。spa
下面,我將一一介紹我所熟悉的數據結構,供你們參考。xml
數組、鏈表
其實,這倆根本不該該算是數據結構,應該算是實現。區分數組與鏈表,應該算是數據結構的實現入門吧~htm
- 數組長度固定,鏈表則更靈活。
- 數組定位訪問速度快,鏈表拼接切分速度快。
堆、並查集、Hash表
- 堆:插入、修改、刪除、取最值,時間 O(logN)OlogN 。
- 並查集:合併兩個集合、查詢兩個元素是否在同一集合之中,時間 O(1)O1 。
- Hash表:插入、修改、刪除、查詢,時間 O(1)O1 。
樹狀數組、線段樹、平衡樹、塊狀數組
- 樹狀數組:單點修改、區間查詢,時間 O(logN)OlogN 。
- 線段樹:區間修改、查詢,時間 O(logN)OlogN 。
- 平衡樹:插入、修改、刪除、查詢、取第k大值,時間 O(logN)OlogN 。
- AVL、紅黑樹:經典,不多用。
- Treap:實現快、速度快,好用。
- Splay:還可區間修改、區間查詢、區間翻轉等等,時間 O(logN)OlogN ,雖然常數大點,但很是靈活,再配上CLJ的實現,簡直舒服。
- 塊狀數組、塊狀鏈表:插入、修改、刪除、查詢、取第k大值,時間 O(N‾‾√)ON 。
可並堆、樹套樹
- 可並堆:能夠合併的堆,依舊保證 O(logN)OlogN 的時間。
- 左偏樹:可並堆中的AVL。
- Random Heap:可並堆中的Treap,這是做者的介紹。
- 斜堆:可並堆中的Splay。
- 斐波那契堆:這東西……實現太複雜,換來的也就是理論複雜度低一些,實在不必-_-#
- 樹套樹:一棵樹的每一個結點都是另外一種樹,以此來結合兩種樹的優勢,同時保證時空複雜度。我比較弱,這個不多寫,都忘得差很少了,就不妄言了。
其餘數據結構
數據結構還有不少不少種,之後或許還會再多寫一點~這裏先隨便列點吧^_^blog
- KD樹、四分樹
- 可持久化數據結構
- 可持久化線段樹(主席樹)
- 可持久化平衡樹
- 可持久化塊狀數組