演算法

qq_50659735發表於2020-10-04

演算法設計的要求

  • 正確性
    • 演算法的正確性是指演算法至少應該具有輸入、輸出和加工處理無歧義性、能夠正確反映問題的需求、能夠得到問題的正確答案。
    • 大體分為一下四個層次:
      • 演算法程式沒有語法錯誤
      • 演算法程式對於合法輸入能夠產生滿足要求的輸出。
      • 演算法程式對於非法輸入能夠產生滿足規格的說明。
      • 演算法程式對於故意刁難的測試輸入都有滿足要求的輸出結果。
  • 可讀性
    • 演算法設計另一目的是為了便於閱讀、理解和交流。
    • 我們寫程式碼的目的,已放面是為了讓計算機執行,但還有一個重要的目的是為了便於他人閱讀和自己日後閱讀修改。
  • 健壯性
    • 當輸入資料不合法時,演算法也能做出相關處理,而不是產生異常、崩潰或莫名其妙的結果。
  • 時間效率高和儲存量低
    • 好演算法就猶如好老婆,應該具備時間效率高和儲存量低的特點。所以在設計演算法的時候我們應該儘量思考著兩方面的問題!

演算法效率的度量方法

  • 事後統計方法:這種方法主要時通過設計好的測試程式和資料,利用計算機計時器對不同演算法編制的程式的執行時間進行比較,從而確定演算法效率的高低。
  • 但這種方法顯然是由很大缺陷的:
    • 必須依據演算法事先編制好測試程式,通常需要花費大量的時間和精力。
    • 不同的測試環境差別不同。
  • 事前估算方法:在計算機程式前,依據統計方法對演算法驚醒估算。

影響演算法效率的因素

  • 1.演算法採用採用的策略、方案
  • 2.編譯產生的程式碼質量
  • 3.問題的輸入規模

函式的漸近增長

  • 函式的漸近增長:給定兩個函式f(n)和g(n),如果存在一個整數N,使得對於所有的n>N,f(n)總時比g(n)大,那麼,我們說f(n)的增長漸近快於g(n)。
  • 判斷一個演算法的效率時,函式中的常量和其他次要的項常常可以忽略,而更應該關注主項(最高項)的階數。

演算法時間複雜度

  • 演算法時間複雜度的定義:在進行演算法分析時,語句總的執行次數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. 用常數1取代執行時間中的所有假髮常數。
2. 在修改後的執行次數函式中,只保留最高階項。
3. 如果最高階項存在且不是1,則去除與這個專案乘的常數。
4. 得到的最後結果就是大O階。

相關文章