時間複雜度與空間複雜度的分析

2021-08-17 15:51:12 字數 1857 閱讀 5422

演算法複雜度分為時間複雜度和空間複雜度

對於乙個演算法來說,空間複雜度和時間複雜度往往是相互影響的。當追求乙個較好的時間複雜度時,可能會使空間複雜度的效能變差,即可能導致占用較多的儲存空間;反之,當追求乙個較好的空間複雜度時,可能會使時間複雜度的效能變差,即可能導致占用較長的執行時間。

有時我們可以用空間來換取時間以達到目的。

int binarysearch(int arr, int size,int x)

return -1;

}int recurbinary(int arr, int left, int right,int x)

else

if (mid1, right, x);

}else

return -1;

}

二分法無論是否遞迴,都是o(log2 n) 每次查詢範圍縮小一半 因此可得出其最壞查詢範圍。

#include 

#include

int main()

num = 0;

while (num++<10)

system("pause");

return0;}

int fibonacci(int num)

else

return ret;

}}int fibonacci2(int num)

return fibonacci2(num - 1) + fibonacci2(num - 2);

}

從執行的時間上來看, 當要輸出前n位斐波那契數列,n比較大時,

使用迭代實現 執行效率是比較高的

使用遞迴方式 執行效率就大大折扣了

遞迴使用的是選擇結構,而迭代使用的是迴圈結構.

遞迴能使程式的結構更加清晰,更加簡潔,更容易讓人理解,從而減少讀懂**的時間,

但大量的遞迴呼叫會建立函式的副本,會消耗大量的時間和記憶體.迭代不不需要反覆呼叫函式和占用額外的記憶體.

如果乙個函式中所有遞迴形式的呼叫都出現在函式的末尾,我們稱這個遞迴函式是尾遞迴的。當遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於表示式的一部分時,這個遞迴呼叫就是尾遞迴。尾遞迴函式的特點是在回歸過程中不用做任何操作,這個特性很重要,因為大多數現代的編譯器會利用這種特點自動生成優化的**。

線性遞迴:

long rescuvie(long n)
尾遞迴:

long tailrescuvie(long n, long a) 

long tailrescuvie(long n)

當n = 5時

對於線性遞迴, 他的遞迴過程如下:

rescuvie(5) }

}} }}}

}}}

}} }

120

對於尾遞迴, 他的遞迴過程如下:

tailrescuvie(5)

tailrescuvie(5, 1)

tailrescuvie(4, 5)

tailrescuvie(3, 20)

tailrescuvie(2, 60)

tailrescuvie(1, 120)

120

很容易看出, 普通的線性遞迴比尾遞迴更加消耗資源, 在實現上說, 每次重複的過程

呼叫都使得呼叫鏈條不斷加長. 系統不得不使用棧進行資料儲存和恢復.而尾遞迴就

不存在這樣的問題, 因為他的狀態完全由n和a儲存.

複雜度分析 時間複雜度 空間複雜度

執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...

複雜度分析(上)時間複雜度 空間複雜度

為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...

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

其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...