1. 程式人生 > >演算法初體驗之演算法的基本概念及定義

演算法初體驗之演算法的基本概念及定義

很多學生,學了四年的計算機專業,很多程式設計師,做了很長時間的程式設計工作,卻始終搞不懂演算法時間複雜度的估算,這不得不說是一件很可悲的事情。因為弄不清楚,也就不去深究自己寫的程式碼是否效率低下了,是不是可以通過優化讓計算機更加快速高效。

演算法的定義

演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示一個或多個操作

演算法的特徵

有窮性,確定性,可行性,輸入,輸出。

演算法的設計的要求

正確性,可讀性,健壯性,高效率和低儲存量的要求

演算法的度量方法

事後統計法,事前分析估算方法

在講解如何讓使用事前估演算法之前,我們先給出了函式漸進增長的的定義。

函式的漸進增長:給定兩個函式f(n)和g(n),如果存在一個整數N,使得對於所有的n>N,f(n)總是比g(n)大,那麼,我們說f(n)的增長漸進快於g(n).於是我們可以得出一個結論,判斷一個演算法好不好,我們只通過少量的資料是不能做出準確判斷的,如果我們可以對比演算法的關鍵執行次數的漸進增長性,基本就可以分析出:某個演算法,隨著n的變大,它會越來越優於另一種演算法,或者說越來越差於另一種演算法。然後給出了演算法時間複雜度的定義和推導大O階的步驟。

推導大O階:

  • 用常數1取代執行時間中的所有加法常數
  • 在修改後的執行次數函式中,只保留最高階項
  • 如果最高階項存在且不是1,則去除與這個項相乘的常數 得到的結果就是大O階

通過這個步驟我們可以得到演算法執行次數表示式後,很快得到它的時間複雜度,即大O階,同時我也提醒大家,其實推導大O階很容易,但如何得到執行次數的表達卻是需要數學功底的。

總結

假設CPU在短短几年間,速度提高了100倍,這其實已經很誇張了,而我們某個演算法可以寫出的時間複雜度是O(n)的程式卻寫出了O(n²)的程式,僅僅因為容易想到也容易寫。即在O(n²)的時間複雜度演算法程式下,速度其實只提高了10倍,而對於O(n)的時間複雜度的演算法來說,那才是真的100倍。也就是說,一臺老式CPU的計算機執行O(n)的程式和一臺速度提高100倍新式CPU執行 O(n²)的程式,最終效率高的勝利方卻是老式CPU的計算機,原因在於演算法的好壞決定了程式執行的效率。