一、棧:
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:數組、鏈表太基礎不在考慮之列。 本文轉載自:http://fuliang.javaeye.com/blog/403605