算法淺談——數據結構

我的水平所限,只能談及幾年前的OI省選水平的算法。再高深的,便不清楚了。html

聲明:算法分類方式與列舉順序借鑑於hzwer同窗的《OI省選算法彙總》算法

OI算法,大抵可分爲如下幾類:數組

  1. 數據結構
  2. 字符串相關
  3. 圖論相關
  4. 數學相關
  5. 動態規劃
  6. 計算幾何
  7. 搜索相關
  8. 不保證正確性的算法
  9. 其餘重要工具與方法

下面依次談一談。數據結構

數據結構

對數據結構的理解,每每隨着接觸愈發深刻。大體會是這樣的歷程——dom

  1. 知道的很少,關注如何實現,實現能力較差
  2. 會超過十個,關注如何選取,實現愈發純熟
  3. 能聯繫起來,關注如何組合,實現基本無誤
  4. 後面的我也不知道了……

首先必須掃盲一下,按我這種分法,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樹、四分樹
  • 可持久化數據結構
    • 可持久化線段樹(主席樹)
    • 可持久化平衡樹
    • 可持久化塊狀數組
相關文章
相關標籤/搜索