【學習總結】《大話數據結構》- 第2章-算法

【學習總結】《大話數據結構》- 總

啓示:

  • 算法:解決特定問題求解步驟的描述,在計算機中表現爲指令的有限序列,而且每條指令表示一個或多個操做。

目錄

<!-- GFM-TOC -->html

<!-- GFM-TOC -->算法

========================================數據結構

2.1 開場白

  • 一些能夠略過的場面話...

========================================數據結構和算法

2.2 數據結構與算法關係

  • 舉例獨角戲《梁山伯》、《羅密歐》類比數據結構和算法的親密關係
  • 本課程以數據結構爲主,算法爲輔

========================================函數

2.3 兩種算法的比較

  • 舉例求1+2+3+...+100的兩種方法學習

    • 1-for循環:sum = sum+i
    • 2-小高斯公式法:sum = (1+n)*n / 2
  • 重點在於:數值小時差很少,數值很大、巨大時,for循環就顯得很慢很重了。。測試

========================================spa

2.4 算法定義

  • 算法(Algorithm)這個單詞最先出如今波斯數學家阿勒·花刺子密的公元825年《印度數字算術》中

  • 算法:

    解決特定問題求解步驟的描述,在計算機中表現爲指令的有限序列,而且每條指令表示一個或多個操做。

    • 指令:能被人或計算機等計算裝置執行。能夠是計算機指令,也能夠是語言文字。

    • 須要把指令表示成必定的操做序列。操做序列包括一組操做,每一個操做都完成特定的功能。這就是算法了。

  • 不一樣問題,對應不一樣算法。至關於不一樣的病症,對應不一樣的藥方。

========================================設計

2.5 算法特性

  • 五個特性:輸入、輸出、有窮性、肯定性、可行性。

  • 1-輸入輸出:

    • 能夠有0個或多個輸入,至少有一個或多個輸出。

    • 輸出:能夠是打印,或者返回一個或多個值,等。

(沒有輸出的算法,是沒有意義的,至關於作了無用功,因此至少有一個輸出,即返回值,或運行後致使了某些改變)3d

  • 2-有窮性:

    • 定義:算法在執行有限的步驟以後,自動結束而不會出現無限循環,而且每個步驟在可接受的時間內完成。

    • 注:‘有窮’:不是純數學意義的,而是在實際應用中合理的、可接受的'有邊界'

(例子:一個算法,須要運行二十年,這是數學意義的有窮的,可是現實意義不大了)

  • 3-肯定性:

    • 定義:算法的每一步驟都具備肯定的含義,不會出現二義性。

    • 具體地:必定條件下,只有一條執行路徑,相同輸入只能有惟一的輸出結果,每一個步驟都被精肯定義而無歧義。

  • 4-可行性:

    • 定義:每一步都必須是可行的,即每一步都可以經過執行有限次數完成。

    • 具體地:可行性意味着算法能夠轉換爲程序上機運行,並獲得正確的結果。

========================================

2.6 算法設計的要求

  • 要求:正確性、可讀性、健壯性、時間效率高和存儲量低、

  • 1-正確性:

    • 定義:算法至少應該具備輸入、輸出和加工處理無歧義性、能正確反映問題的需求、可以獲得問題的正確答案。

  • 2-可讀性:

    • 定義:算法設計的另外一目的是爲了便於閱讀、理解和交流。

    • 可讀性是算法(包括實現它的代碼)好壞的很重要的標誌。

  • 3-健壯性:

    • 定義:當輸入數據不合法時,算法也能作出相關處理,而不是產生異常或莫名其妙的結果。

  • 4-時間效率高和存儲量低

    • 考慮時間複雜度和空間複雜度的問題

    • 用最少的存儲空間,花最少的時間,辦成一樣的事,就是好的算法。

========================================

2.7 算法效率的度量方法

  • 1-過後統計方法:

    • 主要是經過設計好的測試程序和數據,利用計算機計時器對不一樣算法編制的程序的運行時間進行比較,從而肯定算法效率的高低。

    • 這種方法具備很大缺陷,好比須要事先編制程序、時間依賴硬件和軟件,測試數據設計困難等

    • 故不予採納本方法

  • 2-事前分析估算方法

    • 定義:在計算機程序編制前,依據統計方法對算法進行估算。

  • 一個程序的運行時間:(拋開硬件、軟件因素),依賴於算法的好壞和問題的輸入規模。輸入規模即輸入量的多少。

  • 求和的兩個方法的對比:

  • 另外一個雙層for循環的例子:

  • 故:測定運行時間最可靠的方法就是計算對運行時間有消耗的基本操做的執行次數。

  • 分析一個算法的運行時間時,要把基本操做的數量與輸入規模關聯起來,即基本操做的數量必須表示成輸入規模的函數。

========================================

2.8 函數的漸近增加

  • 定義:

  • 判斷一個算法的效率時,函數中的常數和其餘次要項能夠忽略,而更應該關注主項(最高階項)的階數。

========================================

2.9 算法時間複雜度

  • 1-定義:

    • 在進行算法分析時,語句總的執行次數 T(n) 是關於問題規模n的函數,進而分析 T(n) 隨n的變化狀況並肯定 T(n) 的數量級。算法的時間複雜度,也就是算法的時間度量,記做:T(n) = O(f(n)),表示隨問題規模n的增大,算法執行時間的增加率和 f(n) 的增加率相同,稱做算法的漸近時間複雜度,簡稱爲時間複雜度。其中 f(n) 是問題規模n的某個函數。

    • 大O記法:用大寫 O() 來體現算法時間複雜度的記法。

    • 隨着n的增大,T(n)增加最慢的算法爲最優算法。

    • 常見時間複雜度的非官方名稱:O(1)-常數階,O(n)-線性階,O(n^2)-平方階

  • 2-推導大O階方法

    • 攻略:

  • 3-常數階

    • 口訣'1':用常數1取代運行時間中的全部加法常數。

    • 注意:無論常數是多少,均記做O(1)

    • 另:分支結構(if結構,switch語句)--不管真假,執行次數恆定,故也是常數階。

    • 栗子一枚:

  • 4-線性階

    • 關鍵:分析循環結構的運行狀況

    • 栗子一枚:

  • 5-對數階

    • 關鍵:當循環體中有加快循環的語句時

    • 栗子一枚:

  • 6-平方階

    • 關鍵:循環的時間複雜度=循環體的複雜度*該循環運行次數(嵌套for時)

    • 例子:

========================================

2.10 常見的時間複雜度

  • 表格總結:

  • 不一樣時間複雜度的時間耗費排序:

    • O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O<(n^n)

========================================

2.11 最壞狀況與平均狀況

  • 時間複雜度的兩種常見類型:

    • 平均時間複雜度(最有意義的,是指望的運行時間)

    • 最壞時間複雜度(最重要的,一種保證,運行時間不會再壞了)

  • 通常沒有特殊說明的狀況下,默認是最壞時間複雜度

========================================

2.12 算法空間複雜度

  • 空間複雜度:

    • 經過計算算法所需的存儲空間實現

  • 計算公式:

    • S(n) = O(f(n)) - 也用大O表示

  • 一般以時間複雜度爲重,不用限定詞時默認爲時間複雜度。

========================================

2.13 總結回顧

  • 算法的定義:解決特定問題求解步驟的描述,在計算機中爲指令的有限序列,而且每條指令表示一個或多個操做。

  • 算法的特性:有窮性、肯定性、可行性、輸入、輸出。

  • 算法的設計要求:正確性、可讀性、健壯性、高效率和低存儲量需求。

  • 算法的度量方法:過後統計方法(不科學不許確)和事前分析估算方法。

  • 函數的漸近增加

  • 推導大O的步驟(123)

  • 常見時間複雜度耗時排序

========================================

2.14 結尾語

END

相關文章
相關標籤/搜索