演算法之時間複雜度簡析

2021-07-29 15:28:08 字數 1652 閱讀 3258

最近準備對演算法進行一些系統的總結和學習,不積跬步無以至千里,不積小流無以成江海.此文主要對時間複雜度進行簡單梳理和個人總結,本人才疏學淺,有所疏漏在所難免,如有不當和錯誤之處,歡迎指正

時間複雜度,用簡單地話描述為:為了大概估算程式運算時間的一種概量。那用什麼來估算的呢?用簡單的程式執行**的次數,如int a = 3執行一次,乙個n此的for迴圈表示執行n次等等。廣義的t(n)表示在乙個完全理想狀態的計算機中程式所執行的實際指令次數,下面會提到的o(n)大o(big oh),ω(omega),θ(theta) 都是對t(n)的乙個大略估算抽象而來,這裡先說明一下個人理解的精確度大小為:t(n)>θ(theta)>ω(omega);θ(theta)比ω(omega)更能確定次數範圍。而這集中表示方法,都是基於big-oh(大o表示法)。

o(f(n))就是大o表示法,裡面是乙個表示式,可以看成是某一演算法所需執行時間始終不會超過某一常數倍的f(n)。嚴格定義為:存在兩個正常數c和n0,若n≥n0時t(n)≤cf(n),則記為t(n) = o(f(n))。f(n)又可以稱為執行時間的成長率(rate of growth),結合上面可以看出,常用的大o時間複雜度的估算比真實的次數大(畢竟幾乎都會有其他時間消耗),

o(1)或o(c) 常數時間

如普通的一行**

o(n) 線性時間

int count = 1;

while(count < n)

執行n次,線性增長,乙個n次的for迴圈也是o(n)

o(log2n) 次線性時間

如:

int count = 1;

while(count < n)

//如果乙個演算法用常數時間(o(1)將問題的大小削減為其一部分(通常是1/2),那麼該演算法就是 o(log n)

比線性時間增長慢,所以叫次線性時間,二分法的時間複雜度也是o(log2n)。

o(n2) 平方時間

如兩層迴圈n次的for迴圈

o(2^n) 指數時間

o(n1og2n) 其他多項式時間

注:常見的演算法時間複雜度由小到大依次為(n較大時):o(1)

ω(g(n))也是類似大o法的時間漸進表示法,先說下嚴格定義:存在兩個正常數c和n0,若n≥n0時t(n)≥cf(n),則記為t(n)= ω(g(n));和大o表示法進行對比得出,ω表示法漸進的時間複雜度比真實的小。

θ(theta)表示法比上面兩種都要精確,第一種嚴格定義為:當且僅當t(n) = o(h(n)),t(n) = ω(h(n)),則t(n)=θ(h(n)),這裡理解為此時的漸進時間複雜度的兩種演算法重疊,前兩中表示法和t(n)相等,則此時的h(n)就是t(n)=θ(h(n))。

++下面引用下個人覺得對θ(theta)的不錯的定義和理解,引用自market.cloud++

定義:f(n)=θ(g(n)),當且僅當存在大於0的常數c1,c2和n0,使得對所有n值而言,n≧n0時,c1g(n)≦f(n)≦c2g(n)均成立。事實上f(n)=θ(g(n)),就是g(n)可同時代表f(n)的上限和下限。以3n+2的例子說明

如果用傳統的不等式來計算增長率,那麼大o法表示t(n)的增長率小於等於f(n)的增長率, ω中t(n)的增長率大於等於g(n)的增長率,θ中t(n)的增長率等於h(n)的增長率

《資料結構和演算法分析第二版》

演算法之時間複雜度

前言 學習這東西,很枯燥也很煩,參考許多博文,選了許多。結合一些東西,記錄一下,也是為了以後回顧學習。演算法效率 說到演算法效率 不得不提兩個指標,那就是 時間複雜度 空間複雜度 好的演算法應該具備時間效率高和儲存量低的特點。計算機能快速完成大量複雜的資料處理,但是要完成這個工作,計算機也是需要一定...

演算法複雜度簡析

1.時間複雜度 1.1 時間頻度 乙個演算法中語句的執行次數稱為語句頻度或時間頻度。記為t n n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。1.2 定義 一般情況下,演算法中基本語句重複執行的次數是問題規模n的某個函式,用t n 表示。若有某個輔助函式f n 使得當n趨近於無窮大...

簡析時間複雜度和空間複雜度

時間複雜度和空間複雜度是用來評價演算法效率高低的2個標準,身為開發者肯定會經常會聽到這2個概念,但它們分別是什麼意思呢?其實這兩個概念從字面意思上也能看出一二 我們一般用 大o符號表示法 來表示時間複雜度 t n o f n n是影響複雜度變化的因子,f n 是複雜度具體的演算法。接下來再看一下不同...