【重學計算機】數據結構與算法

PS:根據極客時間《數據結構與算法之美 -- 王爭》學習總結,極客時間版權全部: https://time.geekbang.org正則表達式

1、複雜度分析

  • 時間複雜度:
    • 表示方式:大O表示法,表示代碼執行時間隨數據增加的趨勢,也叫漸進時間複雜度
    • 計算方法:加法法則,乘法法則
    • 常見量級:O(1)、O(logn)、O(n)、O(nlogn)、O(n2) ... O(nk)、O(2n)、O(n!)
    • 常見分類:最好、最壞、平均、攤還
  • 空間複雜度:略
  • 其餘:
    • 遞歸樹分析複雜度

2、線性表

  • 數組:連續內存空間
  • 鏈表:不連續的內存空間
    • 分類:單鏈表、雙鏈表、循環鏈表
    • tips
      • LRU緩存淘汰策略可用有序單鏈表實現
      • 可用增長散列表的方式,提升查詢鏈表的效率,降爲O(1)
      • 利用哨兵簡化鏈表實現
  • :先近後出,一種操做受限的線性表
    • 分類:順序棧(數組實現)、鏈式棧(鏈表實現)
    • 應用:函數調用、表達式求解、括號匹配
    • tips:支持動態擴容的順序棧,攤還分析複雜度仍是O(1)
  • 隊列:先進先出
    • 分類:順序隊列、鏈式隊列、循環隊列、阻塞隊列、併發隊列

3、散列表

  • 應用:加密、數據校驗、負載均衡、分片、分佈式(一致性哈希)

4、樹

  • 概念:跟節點、葉子結點、父節點、子節點、兄弟節點;高度、深度、層
  • 分類:二叉樹、徹底二叉樹、滿二叉樹、二叉查找樹、平衡二叉樹、B樹
  • 遍歷:前序、中序、後序、層序
  • 經典實現:
    • 平衡二叉查找樹:AVL樹、紅黑樹、伸展樹、樹堆
  • 堆:
    • 定義
      • 堆是一個徹底二叉樹;
      • 堆中每個節點的值都必須大於等於子樹中每個節點
    • 操做:
      • 插入:上浮堆化
      • 刪除:下濾堆化
      • 排序:建堆、排序

5、圖

6、基本算法思想

  • 遞歸
第一步:找到遞推公式和終止條件
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揹包問題:
    • 問題特徵:
      • 最優子結構:最優解中包含子問題最優解
      • 無後效性:後面的決策不會影響前面已經肯定的決策
      • 重複子問題:相同階段不一樣決策,含有重複的狀態
      •  

7、排序

  • 插入排序
  • 冒泡排序
  • 選擇排序
  • 歸併排序
  • 快速排序
  • 桶排序
  • 堆排序

8、搜索

9、查找

  • 二分查找
  • 跳錶查找

10、字符串匹配

  • 單模式匹配:
    • BF算法:暴力匹配
    • RK算法:經過哈希優化
    • BM算法:根據壞字符和好後綴,一次性向右移動多位

11、其餘

相關文章
相關標籤/搜索