一、時間複雜度
複雜度量級 粗略地可以分為多項式量級和非多項式量級。其中,非多項式量級只有兩個:
我們把時間複雜度為非多項式量級的演算法問題叫作 np(non--deterministic polynomial,非確定多項式)問題。
1. o(1)
1一般情況下,只要演算法中不存在迴圈語句、遞迴語句,即使有成千上萬行的**,其時間複雜度也是o(1)。int i = 8;2
int j = 6;3
int sum = i + j;
2. o(logn)、o(nlogn)
1 i=1;2只要知道 x 值是多少,就知道這行**執行的次數了,這段**的複雜度就是while (i <=n)
。
1 i = i * 2等於,o(cf(n)) = o(f(n)),統一表示為 o(logn)。;2 i = i * 3;3
.4.5
.6 i = i * 100;
迴圈執行 n 遍,時間複雜度就是 o(nlogn)。
比如,歸併排序、快速排序的時間複雜度都是 o(nlogn)。
3. o(m+n)、o(m*n)
加法法則:如果 t1(n)=o(f(n)),t2(n)=o(g(n));那麼 t(n)=t1(n)+t2(n)=max(o(f(n)),
乘法法則:如果 t1(n)=o(f(n)),t2(n)=o(g(n));那麼 t(n)=t1(n)*t2(n)=o(f(n))*o(g(n))=o(f(n)*g(n)).
**的複雜度由兩個資料的規模來決定,無法事先評估 m 和 n 誰的量級大:
修改加法法則為:t1(m) + t2(n) = o(f(m) + g(n))。 乘法法則繼續有效:t1(m)*t2(n) = o(f(m)* f(n))。
二、空間複雜度
時間複雜度的全稱是漸進時間複雜度,表示演算法的執行時間與資料規模之間的增長關係。
模擬一下,空間複雜度全稱就是漸進空間複雜度,表示演算法的儲存空間與資料規模之間的增長關係。
常見的空間複雜度就是 o(1)、o(n)、o(n2 )
三、最好最壞情況時間複雜度
最好情況時間複雜度就是,在最理想的情況下,執行這段**的時間複雜度。
最壞情況時間複雜度就是,在最糟糕的情況下,執行這段**的時間複雜度。
1平均情況時間複雜度://n 表示陣列 array 的長度
2int find(int array, int n, int
x) 10}11
return
pos;
12 }
有 n+1 種情況:在陣列的 0~n-1 位置中和不在陣列中,每種情況下,查詢需要遍歷的元素個數累加起來,
然後再除以 n+1,得到需要遍歷的元素個數的平均值,
時間複雜度的大 o 標記法中,可以省略掉係數、低階、常量。簡化之後,得到的平均時間複雜度就是 o(n)。
考慮概率進去如下:
假設在陣列中與不在陣列中的概率都為 1/2。另外,要查詢的資料出現在 0~n-1 這 n 個位置的概率也是一樣的,為 1/n。
這個值就是概率論中的加權平均值,也叫作期望值,所以平均時間複雜度的全稱應該叫加權平均時間複雜度或者期望時間複雜度。
去掉係數和常量,這段**的加權平均時間複雜度仍然是 o(n)。
四、均攤時間複雜度
平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊、更加有限。
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...