十大常用數據結構

一、棧:

1、後綴表達式的求值;
2、中綴到後綴表達式的轉換;
3、深度優先搜索的非遞歸實現;
4、動態規劃的優化:用於維護一個凸序列,便於二分查找,如LIS問題的O(nlgn)算法。

二、隊列:
1、樹的層序遍歷;
2、廣度優先搜索;
3、Bellman-Ford算法的SPFA實現;
4、網絡流中FF算法的Edmonds-Karp實現,以及Preflow算法的隊列優化實現。


三、二叉搜索樹:

1、對大量的關鍵字的索引查找;
2、有很多平衡策略以改善其平均性能:
常用平衡樹:AVL,紅黑樹,隨機化BST,Splay Tree,Treap(或叫笛卡兒樹)。

四、散列表(hash表):
1、一般針對值域較大但狀態很稀疏的應用,比如狀態壓縮記憶化搜索;
2、實現映射功能。

五、檢索樹(Trie):
1、一般用於字符串索引算法,速度快,但佔用空間較大(相對hash);
2、常用的改進結構:Patricia線索樹,多叉檢索樹(TST)。

六、優先隊列:

1、常用的是二叉堆的實現,具體應用如堆排序和Dijkstra算法;
2、當需要快速合併兩個優先隊列時,常用二項式隊列,實現簡單。
3、注意最大最小堆的配對使用。

七、線段樹和樹狀數組:

1、兩者都可以用於離散對象的統計;
2、後者的步進函數的性質和應用值得注意;
3、前者基本上適用於任何的區間操作,如求區間最值,改變區間的值等。
4、線段樹還可以用於優化狀態的枚舉,經常和動態規劃結合。

八、後綴樹與後綴數組:

1、總體規律是兩者的實現都比較複雜,前者更甚,但是前者的功能也更強大;
2、幾乎可以解決所有常見的關於字符串的算法,如最長迴文子串,最長重複子串,以及很多的模式匹配問題。

九、並查集:

1、解決無向圖的連通性問題,如用於Kruskal算法;
2、解決等價關係的查詢(這是它的主要用武之地),如05年Baidu之星初賽的石頭剪子布遊戲;
3、優點是實現異常簡單,缺點是合併後無法分離,若需要可以選擇用動態樹。

十、鄰接表和邊表:

1、表示圖的最直接的方法;
2、後者更省空間,並且在一定程度上更好用,比如Bellman-Ford算法。
ps:數組、鏈表太基礎不在考慮之列。

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