1. 程式人生 > >演算法與演算法設計的幾大準則

演算法與演算法設計的幾大準則

演算法的定義

  • 那麼演算法到達什麼,首先分2個層面,在現實世界裡,演算法就是 解決問題的一個方案,比如我要修一棟房子,我們先打地基,在造框架,在砌牆,在粉刷,在裝飾,。這個算一種針對修房子問題的一種解決方案,但是修房子是隻有這一種方案嗎,肯定很多的,但是一些基本思路也行一樣。所以演算法在具體場景中是針對某個問題提出的一種解決方案。
  • 那麼現在談我們要真的需要涉及的概念就是在程式設計中的演算法到底什麼,首先我們需要找到一個具體問題,比如我們需要對一堆學生的成績資料進行排序,那麼我們就會針對這個資料編寫具體操作的程式碼,可以實現資料的排序,這個程式碼在cpu角度上就一串針對具體問題可以由cpu解析執行的有序序列。
  • -

演算法的5大特性

  • 有窮性 有窮性是這個演算法的指令序列肯定是可以在有限時間記憶體執行完畢。比如如果我們需要知道學生成績的排序榜,那麼我需要對這個資料設計演算法進行排序,那麼如果我們這個演算法一直在操作資料讓他排序一直沒有結束,那麼我們什麼時候可以看到這個排序榜呢。

  • 確定性 確定性就是我們設計的演算法在具體程式碼執行的是唯一確定的,比如a > 10, 我們執行吃飯;而不是說隨意。

  • 可行性 我們設計的演算法針對的問題可以分解為具體的小步驟,而每個步驟又是可以在有限時間內執行完畢,就是說這個演算法是行得通的,或者稱之為有效的。
  • 輸出 計算機在執行了這些指令序列之後必須有具體的結果,然後我們拿到結果才有價值。
  • 輸入 我們可以有0或者1以上的輸入交給這個演算法。

演算法設計的要求

我們設計的演算法肯定是想需要計算機的記憶體或者磁碟空間越少越好,執行這個演算法的指令序列需要的時間越少越好。
因此引入2個針對演算法設計提出2個概念就是時間複雜度和空間複雜度:
時間複雜度是當前設計的演算法執行完這個指令序列需要的時間。但是不同演算法執行需要的時間我們根據輸入的資料規模會需要不同的時間,比如常量級就是說隨著你輸入資料的規模我們的需要時間並不會增長。比如我們求1 + … + 100;如果我用 (1 + 100)/2*50,這個公式去求和,那麼即使是求1+ … + 1000,也是執行一個指令序列。因此這個演算法需要的時間為0(1),也有線性關係隨便n的增加,執行的指令序列需要的時間按照這個線性關係變化等。
下面我給時間複雜度下個公式: T(n) = 0(f(n)) 其中T(n) 就是演算法的時間複雜度,n表示是輸入到演算法的資料模組比如求和中n = 100, 50,都不同 而f(n)就是根據n不同得到的指令執行的次數的一個函式。
三種常用時間複雜度:0(1)常量級 0(n)線性級 0(n^2)平方級