1. 程式人生 > >資料結構與算法系列一(開篇)

資料結構與算法系列一(開篇)

1.引子

1.1.為什麼要學習資料結構與演算法?

有人說,資料結構與演算法,計算機網路,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀!

有人說,我是做業務開發的,只要熟練API,熟練框架,熟練各種中介軟體,寫的程式碼不也能“飛”起來嗎?

於是問題來了:為什麼還要學習資料結構與演算法呢?

#理由一:
    面試的時候,千萬不要被資料結構與演算法拖了後腿
#理由二:
    你真的願意做一輩子CRUD Boy嗎
#理由三:
    不想寫出開源框架,中介軟體的工程師,不是好廚子

1.2.如何系統化學習資料結構與演算法?

我想好了,還是需要學習資料結構與演算法。但是我有兩個困惑:

1.如何著手學習呢?

2.有哪些內容要學習呢?

學習方法推薦:

#學習方法
1.從基礎開始,系統化學習
2.多動手,每一種資料結構與演算法,都自己用程式碼實現出來
3.思路更重要:理解實現思想,不要背程式碼
4.與日常開發結合,對應應用場景

學習內容推薦:

資料結構與演算法內容比較多,我們本著實用原則,學習經典的、常用的資料結構、與常用演算法

#學習內容:
1.資料結構的定義
2.演算法的定義
3.複雜度分析
4.常用資料結構
    陣列、連結串列、棧、佇列
    散列表、二叉樹、堆
    跳錶、圖
5.常用演算法
    遞迴、排序、二分查詢
    搜尋、雜湊、貪心、分治
    動態規劃、字串匹配

2.考考你

#考考你:
1.你能用自己的話給資料結構下定義嗎?
2.你能用自己的話給演算法下定義嗎?
3.你知道複雜度分析嗎?
4.你知道時間複雜度分析嗎?
5.你知道空間複雜度分析嗎?
6.你知道大O表示法的含義嗎?

 

3.討論分享

#考考你答案:
1.你能用自己的話給資料結構下定義嗎?
  1.1.資料結構,就是【儲存資料】的結構
  1.2.比如:圖書館將書籍分類、按照規律編號儲存
  1.3.那麼按照規律編號,就是“書籍資料”的儲存結構
  
2.你能用自己的話給演算法下定義嗎?
  2.1.演算法,就是【操作資料】的方法
  2.2.比如:你要找書,一本一本的找是演算法
  2.3.比如:你要找書,根據書籍的分類找也是演算法

3.你知道複雜度分析嗎?
  3.1.資料結構與演算法核心二字決:快、省
  3.2.快,是指執行效率要高
  3.3.省,是指消耗的空間要少
  3.4.通過複雜度分析,可以衡量演算法的執行效率
  3.5.通過複雜度分析,可以衡量演算法的空間消耗

4.你知道時間複雜度分析嗎?
  4.1.【時間】複雜度分析,用於衡量演算法的執行效率
  
5.你知道空間複雜度分析嗎?
  5.1.【空間】複雜度分析,用於衡量演算法的空間消耗

6.你知道大O表示法的含義嗎?
  6.1.大O表示法:時間複雜度,表示資料規模的增長,與演算法執行時間的增長趨勢
  6.2.大O表示法:空間複雜度,表示資料規模的增長,與演算法儲存空間的增長趨勢
  6.3.大O表示法公式:T(n)=O(f(n))
  6.4.公式解讀:
    T(n):代表程式碼執行時間
    n:代表資料規模
    f(n):代表每行程式碼執行的次數總和
    O:表示程式碼執行時間T(n),與程式碼執行次數f(n)成正比
    
  6.5.栗子:
  public int sum(int n){
    int sum = 0;
    for(int i=1;i<=n;i++){
      sum +=i;
    }
    
    return sum;
   }
   a.以上程式碼時間複雜度是:O(n)
   b.大O表示法公式:T(n)=O(f(n))
   c.由於f(n)是一個線性函式,推匯出:T(n)=O(n)

&n