1. 程式人生 > >[轉載]如何清晰的理解演算法中的時間複雜度?

[轉載]如何清晰的理解演算法中的時間複雜度?

演算法時間複雜度用來度量演算法執行時間的多少,用大O階表示,即T(n)=O(f(n)),其中n為問題規模,也就是問題的大小。

既然要理解時間複雜度,我們首先理解術語中的兩個關鍵詞——“演算法”和“時間”,理解了它倆就成功一半了。

首先看“演算法”,演算法是解決特定問題的方法,在計算機領域裡需要將演算法用計算機能聽懂的語言描述給它聽,明白之後它才能使用運算能力解決問題。計算機能聽懂的語言,當然是程式程式碼了(還需編譯器將程式碼翻譯成2進位制流),也就是一系列的指令。

再看“時間”,此處的時間指執行演算法消耗的時間,也就是計算機執行前面所說的一系列指令的時間。這個時間受

  • 計算機執行每條指令的速度->硬體層面
  • 編譯產生的程式碼質量->軟體層面
  • 演算法的好壞(演算法使用的策略)
  • 問題規模

的影響。在給定軟硬體環境下,其實就是你在自己電腦上寫演算法的時候,演算法執行時間只受演算法本身的好壞和要處理的問題的規模影響。這樣就將4個影響因素減少為2個,簡化了問題

既然執行時間受演算法好壞和問題規模n的影響,那麼執行時間就是它倆的函式。

那這個函式到是啥樣的呢?

我們繼續分析,給定問題規模n之後,優秀的演算法可能哐哐哐執行幾次就搞定了,一般的演算法可能吭哧吭哧執行很多很多次才搞定;當給定演算法時,問題規模n很小時,可能執行幾次就搞定,而n很大時,就得執行很多次了。所以演算法優劣和問題規模n改變時,執行次數(基本運算元)將改變,所以執行次數就是演算法優劣和問題規模n的函式。

到此為止,我們得出一個簡單的結論:演算法執行時間可以用執行次數表示

世界豐富多彩,同一個問題有不同的解決辦法,比如餓了,可以吃米粉也可以吃包子,可以一個人吃也可以一個人吃(hh)。對應演算法領域,同一個問題也可以用不同的演算法解決,既然這樣,那不同的演算法之間肯定有優劣之分,如何評價呢?

最簡單的評價方法是把兩個演算法拉過來比誰解決問題的速度快,誰的執行時間短,誰的執行次數少。

給定演算法時,執行次數變為問題規模n的函式。比如一個演算法是a,一個演算法是b,問題規模為n,那麼執行次數分別為Ca=f(n),Cb=g(n)。現在將比較兩個演算法的執行次數的問題轉換為比較兩個函式f(n),g(n)的問題

。那比較兩個函式的什麼性質呢?當然是比較隨著問題規模n增大,執行次數的增加情況,也就是f(n),g(n)的增長情況。好比讓兩個人吃一百個包子,一個人一小時吃完,一個人一分鐘吃完,明顯一分鐘吃完的那個人能力強,效率高,吃法(演算法)更先進(hh)。

要比較兩個函式的增長情況,最好的辦法是比較函式的一階導,這樣最精確,但是考慮到很多時候只需要大體瞭解演算法的優劣就可以了,所以我們就直接考察對增長速度影響最大的一項,這一項就是函式的最高階數。為了說明最高階數對函式增長影響最明顯,我們看兩幅圖。



圖中4條曲線分別表示4種不同的執行次數表示式,從圖中可以看出,只要最高項的階數相同,4種表示式值受其他項的影響很小,隨著n增大,幾乎可以忽略不計,甚至可以忽略與最高項相乘的常數。

既然可以只考慮最高項的階數,以簡化問題,達到估算的目的,為何不這樣做呢?

那總得給這種情況一個恰當的表示方式吧?和其他領域一樣,還得用符號來表示,這個符號就是大名鼎鼎的大O

T(n)=O(f(n))

其中,T(n)就是演算法的時間複雜度;

f(n)表示執行與演算法優劣和問題規模有關的執行數;

O()表示一種運算子號,和+-*/類似。作用就是去除其他項,包括與最高項相乘的常數,只保留最高項,比如f(n)=2n^2+1,O(f(n))=O(n^2)

好了,我們已經推匯出了時間複雜度的大O表示,應該對演算法時間複雜度有個不錯的認識了吧。

最後回顧一下推導過程:

演算法執行時間->4種因素影響->去除軟硬體因素,考慮演算法優劣和問題規模n兩種因素->演算法執行次數->簡化:忽略其他項->大O表示法表示演算法時間複雜度

相關推薦

演算法時間複雜概括——o(1)、o(n)、o(logn)、o(nlogn)

在描述演算法複雜度時,經常用到o(1), o(n), o(logn), o(nlogn)來表示對應演算法的時間複雜度。這裡進行歸納一下它們代表的含義:這是演算法的時空複雜度的表示。不僅僅用於表示時間複雜度,也用於表示空間複雜度。   O後面的括號中有一個函式,指明某個演算法的

【轉】演算法時間複雜概括——o(1)、o(n)、o(logn)、o(nlogn)

       在描述演算法複雜度時,經常用到o(1), o(n), o(logn), o(

設計一個演算法,將一維陣列A(下標從1開始)的元素迴圈右移k位,要求只用一個元素大小的附加儲存空間。給出演算法時間複雜

程式碼 #include<stdio.h> #include<stdlib.h> #define n 10 int main() { int a[n] = { 0,1,2,3,4,5,6,7,8,9 }; int k, t=0,i,j,m; printf(

計數排序,傳說時間複雜O(n+k)的排序演算法

基本思想 假設數序列中小於元素a的個數為n,則直接把a放到第n+1個位置上。當存在幾個相同的元素時要做適當的調整,因為不能把所有的元素放到同一個位置上。計數排序假設輸入的元素都是0到k之間的整數。 回到頂部 參考程式碼 #include &

尋找主元素演算法時間複雜O(N),C#)

主元素問題:大小為N的陣列A,其主要元素是一個出現次數超過N/2的元素。 最近在學習演算法,書上發現這樣一道題,並且提供了一種遞迴演算法的概要,但是感覺不是特別好(遞迴判斷(時間複雜度大於O(N)了),還要對N的奇偶做出判斷以及使用附加陣列B),網上看了一下有一個SEO排行最靠前的(不說名字了,

資料結構(排序演算法和查詢演算法時間複雜和空間複雜

這是從大神給多的網站上找到的演算法的時間複雜度趨勢和各個常用結構的複雜度截圖。     演算法的時間複雜度,用來度量演算法的執行時間,記作: T(n) = O(f(n))。它表示隨著 輸入大小n 的增大,演算法執行需要的時間的增長速度可以用 f(n) 來描

常用排序演算法時間複雜和空間複雜及特點

一、常用排序演算法的時間複雜度和空間複雜度表格 二、特點 1.歸併排序: (1)n大時好,歸併比較佔用記憶體,記憶體隨n的增大而增大,但卻是效率高且穩定的排序演算法。 (2)歸併排序每次遞迴都要用到一個輔助表,長度與待排序的表長度相同,雖然遞迴次數是O(log2n),但每次

演算法時間複雜和空間複雜計算

一、演算法的時間複雜度定義     在進行演算法分析時,語句總的執行次數T(n)是關於問題規模n的函式,進而分析T(n)隨n的變化情況並確定T(n)的數量級。演算法的時間複雜度,也就是演算法的時間量度。記作:T(n)=O(f(

八種排序演算法時間複雜複雜

https://www.cnblogs.com/dll-ft/p/5861210.html 轉載 1、穩定性 歸併排序、氣泡排序、插入排序。基數排序是穩定的 選擇排序、快速排序、希爾排序、堆排序是不穩定的   2、時間複雜度 最基礎的四個演算法:冒泡、選擇

遞迴樹——藉助樹來求解遞迴演算法時間複雜

遞迴程式碼的時間複雜度分析起來非常麻煩,今天我們嘗試來藉助遞迴樹分析遞迴演算法的時間複雜度。 1. 遞迴樹與時間複雜度分析 遞迴的思想就是將大問題一層一層地分解為小問題來求解,如果我們把這個分解過程畫成圖,它其實就是一棵樹,我們稱之為遞迴樹。 上圖為斐波那契數列的遞迴樹,節點裡的數字表示資

演算法時間複雜和空間複雜-總結(轉)

演算法的時間複雜度和空間複雜度-總結         通常,對於一個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式、數學歸納法等。而在證明演算法是正確的基礎上,第二部就是分析演算法的

初學者學演演算法|談什麼是演演算法時間複雜

進階篇:深入時間複雜度的實際情況到目前為止,我們認識了何謂演演算法,以及評斷演演算法設計好壞的工具:時間複雜度。接下來的部分,屬於比較進階的練功,對剛接觸的新手可能會覺得有點難度或沒辦法完全理解。小小的建議是,如果你看第一次沒辦法完全體會,可以留到對程式設計更熟悉後再回頭複習。而當然,如果有任何問題也都歡迎討

preNoip時間複雜的計算

特徵方程法解一階線性代數遞推式 數列{ana_nan​}滿足a1=b,an+1=can+da_1=b,a_{n+1}=ca_n+da1​=b,an+1​=can​+d,求該數列的通項公式 針對遞推關係

各種排序演算法時間複雜

選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法, 氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 排序演算法不穩定的含義是:在排序之前,有兩個數相等. 但是在排序結束之後,它們兩個有可能改變順序. 比如說:  在一個待排序佇列中,A和B相等,且A排在

問題:求n以內的所有素數。要求給出自然語言描述的演算法,並且實現演算法。事先分析演算法時間複雜和空間複雜。/*如果錯誤或相關改進的歡迎提出,謝謝!*/

/*2018.10.20上傳,該貼還有部分需要完善,比如2輸不出,還有許多可以優化的地方,未完,待更~~*/ #include <stdio.h> #include <math.h> #include <time.h> void pr

遞迴演算法時間複雜分析

在演算法分析中,當一個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為一個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法:     (1)代入法(Substitution Method)  

總結:演算法時間複雜換和空間複雜

一,演算法的時間複雜度     演算法的時間複雜度反應了程式執行時間隨輸入的規模增長而增長的量級,在很大程度上反映出演算法的優劣與否     1,時間複雜度     時間頻度:一個演算法中語句執行的次數稱為語句頻度或者時間頻度記為T(n)     時間複雜度:在剛才提

演算法時間複雜例子解析

詳解來源 (1)、O(1) Temp=i; i=j; j=temp; 以上三條單個語句的頻度均為1,該程式段的執行時間是一個與問題規模n無關的常數。演算法的時間複雜度為常數階,記作T(n)=O(1)。注意:如果演算法的執行時間不隨著問題規模n的增加而增長,

資料結構和演算法(4)-----演算法時間複雜和空間複雜

1.演算法的時間複雜度定義  在進行演算法分析時,語句總的執行次數T(n)是關於問題規模n的函式,進而分析T(n)隨n的變化情況並確定T(n)的數量級。演算法的時間複雜度,也就是演算法的時間量度。記作:T(n)=O(f(n))。它表示隨問題n的增大,演算法執行時間的增長率和f(n)的增

遞迴樹求解遞迴演算法時間複雜

  遞迴演算法時間複雜度的計算方程式一個遞迴方程:      在引入遞迴樹之前可以考慮一個例子:   T(n) = 2T(n/2) + n2   迭代2次可以得:   T(n) = n2 + 2(2T(n/4) + (n/2) 2)   還可以繼續迭代,將其完全