PS:根據極客時間《數據結構與算法之美 -- 王爭》學習總結,極客時間版權所有: https://time.geekbang.org
一、復雜度分析
- 時間復雜度:
- 表示方式:大O表示法,表示代碼執行時間隨數據增長的趨勢,也叫漸進時間復雜度
- 計算方法:加法法則,乘法法則
- 常見量級:O(1)、O(logn)、O(n)、O(nlogn)、O(n2) ... O(nk)、O(2n)、O(n!)
- 常見分類:最好、最壞、平均、攤還
- 空間復雜度:略
- 其他:
- 遞歸樹分析復雜度
二、線性表
- 數組:連續內存空間
- 鏈表:不連續的內存空間
- 分類:單鏈表、雙鏈表、循環鏈表
- tips:
- LRU緩存淘汰策略可用有序單鏈表實現
- 可用增加散列表的方式,提高查詢鏈表的效率,降為O(1)
- 利用哨兵簡化鏈表實現
- 棧:先近后出,一種操作受限的線性表
- 分類:順序棧(數組實現)、鏈式棧(鏈表實現)
- 應用:函數調用、表達式求解、括號匹配
- tips:支持動態擴容的順序棧,攤還分析復雜度還是O(1)
- 隊列:先進先出
- 分類:順序隊列、鏈式隊列、循環隊列、阻塞隊列、並發隊列
三、散列表
- 應用:加密、數據校驗、負載均衡、分片、分布式(一致性哈希)
四、樹
- 概念:跟節點、葉子結點、父節點、子節點、兄弟節點;高度、深度、層
- 分類:二叉樹、完全二叉樹、滿二叉樹、二叉查找樹、平衡二叉樹、B樹
- 遍歷:前序、中序、后序、層序
- 經典實現:
- 平衡二叉查找樹:AVL樹、紅黑樹、伸展樹、樹堆
- 堆:
- 定義:
- 堆是一個完全二叉樹;
- 堆中每一個節點的值都必須大於等於子樹中每一個節點
- 操作:
- 插入:上浮堆化
- 刪除:下濾堆化
- 排序:建堆、排序
- 定義:
五、圖
六、基本算法思想
- 遞歸:
第一步:找到遞推公式和終止條件
f(1) = 1; f(2) = 2; f(n) = f(n-1)+f(n-2)
第二步:翻譯成代碼
int f(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return f(n-1) + f(n-2);
}
- 貪心算法:
- 分糖果(滿足最多孩子):從需求小的孩子開始,將最小能滿足他的糖果先分給他。依次類推
- 錢幣找零(用最少紙幣):先用最大紙幣,再依次遞減,最后用1元補齊
- 區間覆蓋(最多選出多少個區間):從左到右選,每次選和左面不重合,右端點右盡量靠左的區間,依次類推
- 分治算法:分解、解決、合並
- 求逆序對:
- 10G訂單金額排序:1-100元,101-200元... 分別排序
- 回溯算法:
- 8皇后問題
- 0-1背包問題
- 正則表達式
- 動態規划:
- 0-1背包問題:
- 問題特征:
- 最優子結構:最優解中包含子問題最優解
- 無后效性:后面的決策不會影響前面已經確定的決策
- 重復子問題:相同階段不同決策,含有重復的狀態
七、排序
- 插入排序
- 冒泡排序
- 選擇排序
- 歸並排序
- 快速排序
- 桶排序
- 堆排序
八、搜索
九、查找
- 二分查找
- 跳表查找
十、字符串匹配
- 單模式匹配:
- BF算法:暴力匹配
- RK算法:通過哈希優化
- BM算法:根據壞字符和好后綴,一次性向右移動多位
十一、其他