數據結構總結

  • 高級數據結構

    • 紅黑樹與AVL樹

      AVL樹: AVL樹、紅黑樹都是自平衡的二叉搜索樹,時間複雜度都爲(log N)。AVL通過左旋,右旋來調整樹的平衡因子,根據LR,LL,RR,RL四種情況判斷左旋與右旋.(比起紅黑樹要簡單得多)

      紅黑樹: 與AVL樹相比,它的刪除時旋轉調整最多三次(AVL樹需要log N次),但是它因此也犧牲了一定的平衡性(黑平衡,兩子樹高度最多相差一倍)。它與B樹中的2-3-4樹類似,它通過父子節點的顏色的關係簡化了2-3-4樹,通過對比兩者,可以更加容易理解紅黑樹.(紅黑樹刪除邏輯太多了,博主放棄了.)
      參考博客:
      從2-3-4樹到紅黑樹
      紅黑樹之刪除節點

    • B樹與B+樹與B*樹

      三者都是多路查找樹,適合作爲數據庫索引,利用磁盤預讀功能,將多個關鍵字放到一個節點上,實現多路查找.B+樹與B樹不同的是,B+樹葉子節點存放的纔是數據(葉子節點都在最後一層,形成了鏈表結構,便於進行範圍查找),而非葉子節點存的是關鍵字,這樣可以存放更多的關鍵字,樹的高度也更低,IO次數也少. B*樹:在B+樹基礎上,爲非葉子結點也增加鏈表指針.

    • 哈希

      通過將key經過哈希函數(O(1)複雜度)並且取模運算後,映射到數組的一個桶上,利用數組的O(1)查找時間,實現O(1)時間的查找.當發生哈希衝突時,可以找個空桶解決(ThreadLocal裏是這樣的),也可以跟一個鏈表.
      哈希函數設計: 數字類型的話,取模一個素數.字符串的話,類似於多進制轉十進制,有興趣可以看一下String類的hashcode()方法.

    • 跳躍表

      好多地方都用到了,有興趣可以瞭解一下.是有序鏈表的一個改進,原來有序鏈表只能以O(N)時間複雜度查找,跳躍表以O(log N)時間查找.並且與紅黑樹相比實現簡單,在併發情況下,同步可以使用CAS操作,而由於紅黑樹操作過多,不適合使用CAS,只能直接加鎖.

    • 字典樹

      在字符串長度有限的情況下,用於統計,排序和保存大量的字符串(不僅限於字符串),經常被搜索引擎系統用於文本詞頻統計。利用字符串的公共前綴來減少查詢時間,最大限度的減少無謂的字符串比較。

    • 經常用於求解TOP K問題(使用快速排序的思想是更快的,但是需要內存足夠的情況),在外排序時,也就是多路歸併時,假設有K個數組,每次選最小的那個值,也就是比較K次,但是如果我們維護一個K大的堆時,每次移除原來最小的值,添加新值時,只需(log N)時間便可調整到最小堆.

    • 位圖

      有點像哈希,將一定範圍的數據映射到連續的桶(位)上,用於排序,或者判斷某些值是否存在.

    • AC自動機

      用於多模式匹配,將多個模式串構成一個字典樹,然後構建其fail指針,類似KMP算法,匹配失敗指向fail指針位置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章