時間複雜度 空間複雜度

2021-09-06 09:33:28 字數 2825 閱讀 5201

演算法複雜度分為時間複雜度和空間複雜度。其作用:時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。

一、時間複雜度

時間頻度

乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。

計算方法

1. 一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f(n),因此,演算法的時間複雜度記做:t(n) = o(f(n))

分析:隨著模組n的增大,演算法執行的時間的增長率和f(n)的增長率成正比,所以f(n)越小,演算法的時間複雜度越低,演算法的效率越高。

2. 在計算時間複雜度的時候,先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出t(n)的同數量級(它的同數量級有以下:1、log2

n 、n 、nlog2

n、n2、n3,2n,n!),找出後,f(n) = 該數量級,若t(n)/f(n)求極限可得到一常數c,則時間複雜度t(n) = o(f(n))

例一:

for(int i = 0; i < n; i++) 

int count = 1

;while(count int count = 1

;while(count 第一和第二個迴圈時間複雜度都是o(n)。通常,如果某個迴圈結構以線性方式執行n次,並且迴圈體的時間複雜度都是o(1),那麼該迴圈的複雜度就是o(n)。即使,該迴圈跳過某些常數部分,只要跳過的部分是線性的,那麼該迴圈體的時間複雜度仍就是o(n)。

第三個迴圈時間複雜度都是o(log2

n)。因為,迴圈體的複雜度是對數級的,該迴圈是o(logn)的,通常情況是2為底的,也就是o(log2

n)。例二:

for(i=1;i<=n;++i)

}

則有 t(n) = n2 + n3,根據上面括號裡的同數量級,我們可以確定n的三次方為t(n)的同數量級;

則有 f(n) = n3,然後根據t(n)/f(n)求極限可得到常數c;

則該演算法的時間複雜度:t(n) = o(n3)。

3. 在pascal中比較容易理解,容易計算的方法是:看看有幾重for迴圈,只有一重則時間複雜度為o(n),二重則為o(n2),依此類推,如果有二分則為o(logn),二分例如快速冪、二分查詢,如果乙個for迴圈套乙個二分,那麼時間複雜度則為o(nlogn)。

分類

按數量級遞增排列,常見的時間複雜度有:(常對線,線對,平立指)

常數階o(1)、對數階o(log2

n)、線性階o(n)、線性對數階o(nlog2

n)、平方階o(n2) 立方階o(n3) ... k次方階o(nk)、指數階o(2n) 。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

c < log2

n< n < nlog2n

< n2

< n3

< 2n

< 3n

< n!

其中c是乙個常量,如果乙個演算法的複雜度為c 、 log2

n 、n 、 nlog2n

,那麼這個演算法時間效率比較高 ,如果是 2n、3n、n!,那麼稍微大一些的n就會令這個演算法不能動了,居於中間的幾個則差強人意。

演算法的時間複雜度和空間複雜度

排序法

最差時間分析

平均時間複雜度

穩定度

空間複雜度

氣泡排序

o(n2)

o(n2)

穩定 o(1)

快速排序

o(n2)

o(n*log2n)

不穩定

o(log2n)~o(n)

選擇排序

o(n2)

o(n2)

穩定 o(1)

二叉樹排序

o(n2)

o(n*log2n)

不一頂

o(n)

插入排序

o(n2)

o(n2)

穩定 o(1)

堆排序o(n*log2n)

o(n*log2n)

不穩定

o(1)

希爾排序oo

不穩定

o(1)

二、空間複雜度

空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s(n)=o(f(n))。比如直接插入排序的時間複雜度是o(n2),空間複雜度是o(1) 。而一般的遞迴演算法就要有o(n)的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間兩個方面衡量。 

三、時間與空間複雜度比較

對於乙個演算法,其時間複雜度和空間複雜度往往是相互影響的。當追求乙個較好的時間複雜度時,可能會使空間複雜度的效能變差,即可能導致占用較多的儲存空間;反之,當追求乙個較好的空間複雜度時,可能會使時間複雜度的效能變差,即可能導致占用較長的執行時間。另外,演算法的所有效能之間都存在著或多或少的相互影響。因此,當設計乙個演算法(特別是大型演算法)時,要綜合考慮演算法的各項效能,演算法的使用頻率,演算法處理的資料量的大小,演算法描述語言的特性,演算法執行的機器系統環境等各方面因素,才能夠設計出比較好的演算法。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。

參考:

時間複雜度 空間複雜度

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

時間複雜度 空間複雜度

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

時間複雜度 空間複雜度

時間複雜度 其實說白了講吧,演算法的時間複雜度就是演算法的執行次數。當討論乙個程式的執行時間時,注重的不應該是該時間的具體值,而是該時間的增長率,在乙個演算法中將該演算法的原操作重複執行的次數與問題規模n之間的關係記為函式f n f n f n 隨著問題規模的增大,它的增長率與f n f n f n...