一、為什麼要分析複雜度
1、假設我們每次都直接用機器去執行**來測試**執行花費的時間,測試的結果很受硬體的影響,比如說i9的cpu和i3的測試結果肯定有很大的差距
2、用機器去測試**的效率很受資料規模的影響,舉個極端的例子,幾十個資料排序,插入排序可能比快排要快。
所以我們要用乙個不用具體的測試資料也不依賴於硬體條件的測試方法,來粗略的估算出演算法(**)的執行效率
二、如何表示複雜度?
t (n
)=o(
f(n)
)t(n) = o(f(n))
t(n)=o
(f(n
))t(n)表示**執行的時間,n表示資料規模或者資料量,公式f(n)表示**執行的次數,o表示t(n)和f(n)成正比。
三、時間複雜度是什麼?如何分析時間複雜度?
時間複雜度,也叫漸進時間複雜度,表示演算法的執行時間和資料規模之間的關係
分析時間複雜度的方法有三種
1、只關注迴圈次數最多的一段**
我們在分析一段**的時候,只關注迴圈執行次數最多的那一段**就可以了
int cal(int n )
return sum;
}
上述**中,2、3行**執行1次,是常量級,與資料量的多少(n的大小)無關係,可以忽略。4、5行**都被執行了n次,所以總的時間複雜度是o(n)。
2、加法法則:總複雜度等於量級最大的那段**的複雜度int cal(int n )
int sum_2 = 0;
int q = 1;
for(;q上述這段**分別求sum_1、sum_2、sum_3,最後求它們總和。我們分成三部分,分別求時間複雜度。
第一部分,只執行了100次,我們算o(100)。
第二部分,執行了n次,時間複雜度是o(n)。
第三部分,執行了外層迴圈的n次,內層迴圈的n²次,時間複雜度我們算o(n+n²)。
我們把三部分加起來就是o(100 + n + n + n²) = o(100 + 2n + n²),我們去掉常數,低階,係數,最終時間複雜度為o(n²)。
去掉常數,低階,常量係數的原因是因為他們隨著資料規模的增大,影響很小。
其中常數(比如剛才的100次),無論是一百萬個資料還是10個資料,都執行一百次,所以直接省略。
係數省略(比如2n的2),無論n的值為多少,他都是常量2,所以省略。
低階省略(省略n),因為相比於n²來說,n的影響遠遠小於n²。
所以我們取量級最大的複雜度來表示
3、乘法法則:巢狀**的複雜度等於巢狀內外複雜度的乘積int f(int n )
{ int sum = 0;
int i =1;
for(;i可以看到函式cal是乙個單層迴圈,但是每次迴圈都會呼叫函式f;所以整個時間複雜度是t(n) = o(n * n) = o(n²)。
四、時間複雜度分類
時間複雜度分為多項式量級和非多項式量級如下。
多項式量級:o(1), o(log n ), o(n), o(nlog n), o(n²)
非多項式量級:o(2的n次方), o(n!)
(演算法的時間複雜度如果是非多項式量級,就是很差了)
五、空間複雜度是什麼?如何分析空間複雜度?
空間複雜度也叫漸進空間複雜度,表示演算法的儲存空間與資料規模的增長關係
分析方式很簡單,舉個例子
void print(int n )
{ int i = 0;
int a = new int[n];
for(;i=0;--i)
{cout《整段**申請了n個int的空間,所以空間複雜度為o(n)。
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...