1. 程式人生 > >資料結構與演算法-演算法複雜度簡介

資料結構與演算法-演算法複雜度簡介

一、演算法

演算法是指令的集合,是為解決特定問題而規定的一系列操作。它是明確定義的可計算過程,以一個數據集合為輸入,併產生一個數據集合作為輸出,簡單來說演算法就是計算機解題的過程。

  • 舉例:如何求1+2+3+...100=?
  • 演算法1:依次相加
  • 演算法2:高斯演算法:首尾相加*(100/2)
  • 演算法3:使用遞迴實現:sum(100)=sum(99)+100  sum(99)=sum(98)+99  ...  sum(2)=sum(1)+2  sum(1)=1

二、評價演算法優劣的依據:複雜度(時間複雜度和空間複雜度)

演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間資源,因此複雜度分為時間複雜度和空間複雜度。

  • 時間複雜度:執行演算法所需要的計算工作量。
  • 空間複雜度:執行演算法所需要的記憶體空間。

1、時間複雜度(TImecomplexit)定義:

1)時間頻度:

  • 一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。
  • 但我們不可能也沒有必要對每個演算法都上機測試。
  • 一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。
  • 一個演算法中的語句執行次數稱為語句頻度或時間頻度,表示為T(n),n表示問題的規模。

2)時間複雜度:

  • 但有時我們想知道它變化時呈現什麼規律,想知道問題的規模,而不是具體的次數,此時引入時間複雜度。
  • 一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用T(N)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函式。記作T(n)=O(f(n)),稱O(f(n))為演算法的漸進時間複雜度,簡稱時間複雜度。
  • T(n)=O(fn)
  • 或者說:時間複雜度就是時間頻度去掉低階項和首項常數。
  • 注意:時間頻度與時間複雜度是不同的,時間頻度不同但時間複雜度可能相同。
  • 比如:某兩個演算法的時間頻度是
  • T(n)=100000n(的平方)+10n+6 T(n)=n(的平方)
  • T(n)=10n(的平方)+10n+6 T(n)=n(的平方)
  • 但是時間複雜度都是T(n)=O(n(的平方))

3)最壞時間複雜度和平均時間複雜度

  • 最壞情況下的時間複雜度稱最壞時間複雜度。
  • 一般不特別說明,討論的時間複雜度均是最壞情況下的時間複雜度。
  • 這樣做的原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上界,這就保證了演算法的執行時間不會比任何更長。
  • 在最壞情況下的時間複雜度為T(n)=O(n),它表示對於任何輸入例項,該演算法的執行時間不可能大於O(n)。
  • 平均時間複雜度是指所有可能的輸入例項均已等概率出現的情況下,演算法的期望執行時間。鑑於平均複雜度難計算、有很多演算法的平均情況和最差情況的複雜度是一樣的,所以一般討論最壞時間複雜度。
  • 為了進一步說明演算法的時間複雜度,定義了O(演算法時間複雜度的上界,最壞情況)、Ω(演算法時間複雜度的下界,最好情況)、Θ(演算法時間複雜度的精確界,最好和最壞是同一階 =)