時間複雜度 空間複雜度

2021-10-14 06:09:39 字數 3221 閱讀 3261

為了讓廣大讀者輕鬆學習,完全理解內容表達含義。我會用最通俗易通的方式結合**表達,讓每位讀者完全熟記每種資料結構和演算法的優缺點!今天我們分享的是時間複雜度和空間複雜度,因為只要講到資料結構與演算法,就一定離不開時間、空間複雜度分析。

首先,什麼是時間複雜度?簡單的講就是指執行這個演算法所需要的執行時間,分為事先統計法和事後統計法,事後統計法就是通過一些監控,指標,來評估演算法的時間複雜度,但是這樣演算法的執行時間,會受到很多因素的影響,例如硬體、執行時環境、資料規模等。所以我們採用事前統計法來評估乙個演算法不依賴於其他環境因素的影響下的效率。

大o複雜度表示法是指所有**的執行時間 t(n) 與每行**的執行次數 n 成某種有規律的函式。例如以下例子一:

int count(int n)}
上圖**中,假如每行**的執行一次的時間為乙個單位的time,那麼第三行1個time,第4,5行都執行了n次,那麼總執行時間就是t(n)=(2n+1)time,通過公式我麼你可以看出,所有**的執行時間 t(n) 與每行**的執行次數 n 成正比,即t(n) = o(f(n)),t(n) 表示**執行的時間;n 表示資料規模的大小;f(n) 表示每行**執行的次數總和,因為**執行次數總和是乙個公式,所以用 f(n) 來表示。公式中的 o,表示**的執行時間 t(n) 與 f(n) 表示式成正比,在例如下面這個例子二:

int count(int n)}}
以上**中,**執行總次數是第二行1個time,第三行執行了n次,所以是n個time第4,5行執行了n^2次,所以總執行時間是(1+n+n^2)time,所以用大o表示就是時間複雜度是t(n)=o(f(n))=o(1+n+n^2)。這就是大 o 時間複雜度表示法,大 o 時間複雜度實際上並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢,所以,也叫作漸進時間複雜度,簡稱時間複雜度。

我們在計算乙個演算法的時間複雜度的時候通常會忽略掉公式中的常量、低階、係數,只統計乙個最大量級的記錄就行了,所以通常統計的方法有以下三種:

只關注迴圈執行次數最多的一段**

例如在例子一中:第2行只執行了一次,是常量級的執行時間,所以與n無關,但是第3、4行執行了n次,所以我們只關係執行次數最多的第3、4行,所以時間複雜度是o(n)。

int count(int n)}
總複雜度等於量級最大的那段**的複雜度

如以下例子,在同乙個getcount(int n)方法中,第一段for迴圈的時間複雜度是o(n),第二段for迴圈的時間複雜度是o(n^2),所以總的複雜度等於量級最大的那段**的複雜度,所以方法getcount的時間複雜度是o(n^2)。

public void getcount(int n)int val = 0;for (int j = 0; j <= n; j++)}}
巢狀**的複雜度等於巢狀內外**複雜度的乘積

同樣例如下面的例子,第3行的執行次數是n次,第4、5行的執行次數是n*n=n^2次,所以count方法的時間複雜度是o(n^2)。

int count(int n)}
o(1)常數階

o(2^n)指數階

o(logn)對數階

o(n!)階乘階

o(n)線性階

o(nlogn)線性對數階

o(n^2)平方階

o(n^3)立方階

o(n^k)k方階

什麼是空間複雜度?模擬時間複雜度,複雜度是表示演算法的儲存空間與資料規模之間的增長關係,舉個例子:

void setval(int n)}return val;}
上圖例子中,我們從陣列arr中查詢x的位置,那麼最好的情況下就是arr[0]就是x的值,那麼只需要查詢一次就可以得到x的索引位置並返回,那麼我們就說上述**的最好情況時間複雜度是o(1)。如果在arr中並沒有值等於x,那麼就需要遍歷整個陣列,然後返回-1,那麼最壞時間複雜度就是o(n)。

平均情況時間複雜度

這個概念有點複雜,需要一點點的數學基礎,我們還用上圖的例子來說明,我們查詢陣列中值是變數x的位置,那麼一共有n+1種可能:在陣列[0~n-1]位置上和 不在陣列中,我們把每種情況下,查詢x需要遍歷的次數累加起來,然後除以n+1,就可以得到需要遍歷的元素個數的平均值,就是:

然後,我們在計算時間複雜度的大 o 標記法中,可以省略掉係數、低階、常量,所以,咱們把剛剛這個公式簡化之後,得到的平均時間複雜度就是 o(n)。雖然結論是對的,但是計算過程不太準確,因為變數x在不在陣列中的概率不一樣,我們假在不在陣列中的概率都是1/2,那麼在陣列[0~n-1]每個位置上的概率都是一樣的,是1/n,那麼根據乘法法則,x在陣列**現的概率就是1/(2n),那麼前面推導的公式就變成:

這個值就是概率論中的加權平均值,也叫作期望值,所以平均時間複雜度的全稱應該叫加權平均時間複雜度或者期望時間複雜度。

均攤情況時間複雜度

結尾好了,感謝閱讀,本篇文章我們主要講了時間複雜度和空間複雜度的含義以及分析方法,和一些時間複雜度情況,更多的篇幅還是主要講解的時間複雜度的分析,這也是因為在面試中,幾乎一旦被問到就一定會問時間複雜度的,空間複雜度相對比較容易識別,最後再給大家分享一下常見的資料結構和演算法的複雜度總結,那麼,我們下期見!

資料結構複雜度對比:

常用排序演算法複雜度對比:

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...

時間複雜度 空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...

時間複雜度 空間複雜度

一 時間複雜度 實際是指程式執行次數,而不是程式執行時間 1.我們一般討論的是最壞時間複雜度,這樣做的原因是 最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上限,以最壞代表最全。2.時間複雜度的書寫規則 忽略常數項,用o 1 表示 選取最壞時間複雜度即選取增長最快的項 遞迴的時間複雜度 遞...