學資料結構和演算法的目的 => 實現程式的高速執行,那麼必然要了解複雜度。
複雜度分為兩個維度:時間、空間。在開發過程中,我們希望時間和記憶體消耗都越少越好,但很多時候無法做到兼顧,需要在時間和空間之間做出取捨已達到最佳狀態。
對複雜度的計算一般採用事前分析估算的方法,即大o表示法。
接下來讓我們進入複雜度的學習!
由保羅·**曼在《解析數論》中首先引入。它描述的是乙個函式數量級的漸進上界,即演算法最壞的情況。
某個演算法的複雜度達到了這個問題複雜度的下界,即為最佳演算法。
比如:從大小為100的存放數字的陣列中找到10,我們需要從頭到尾遍歷,那麼這個是時間複雜度就為 ο(n),(這裡n=100,下面講解為何為ο(n))。若10不是陣列最後一項,我們在<100次的時候就找到 ,可跳出迴圈,所以,大o表示法描述的是最壞的情況。
說明:1. 決定演算法複雜度的,是度量乙個程式片段的執行時間執行次數最多的語句
;2. 複雜度的得出,忽略了
常量,低次冪和最高次冪的係數
;3. 加法法則:總複雜度
量級最大
的那段**的時間複雜度;
3. 乘法法則:巢狀**的複雜度等於
內外**複雜度的乘積
。
度量乙個程式的執行時間通常有兩種方法1. ο(1):(常數階)如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數;ο(1)<ο(log2(n))<ο(n)<ο(n^2)<ο(n^3)<…<ο(2^n)
我們可以用
console.time(''mark) console.timeend(''mark)
來檢視執行時間
let a = 1;
let b = 2;
let temp = a;
a = b;
b = temp;
2. ο(logn):(對數階)(以2為底n的對數)當資料增大 n 倍時,耗時增大 logn 倍(比如,當資料增大 256 倍時,耗時只增大 8 倍);
例子:二分查詢就是 o(logn)的演算法,每找一次排除一半的可能。
let i = 1;
while(i <= n)
3. ο(n):(線性階)資料量的增大幾倍,耗時也增大幾倍;
for(i = 1; i <= n; i++)
4. ο(n^2):(平方階)資料量增大 n 倍時,耗時增大 n 的平方倍;
for(i = 1; i <= n; i++)
}
本文章持續完善中...... 大O表示法 時間複雜度
引入原因 用另乙個 通常更簡單的 函式來描述乙個函式數量級的漸近上界。定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式。t n 稱為這一演算法的 時間複雜度 某個演算法的複雜度到達了這個問題複雜度的下界,那就稱這樣的演算法是最佳演算法 決定演算法複雜度的是執...
大O法時間複雜度計算
困惑的點 log,如何計算得出?上限 用來表示該演算法可能有的最高增長率。大o表示法 如果某種演算法的增長率上限 最差情況下 是f n 那麼說這種演算法 在o f n 中 n為輸入規模。上限的精確定義 對非負函式t n 若存在兩個正常數c和n0,對任意n n0,有t n t n 表示演算法的實際執行...
大O演算法複雜度表示
序言 演算法的時間複雜度和空間複雜度都是用 大o表示法 來表示的。其中o是個常量。常見的排序演算法的時間複雜度 氣泡排序 插入排序 希爾排序 選擇排序的時間複雜度是o n 2 快速排序的時間複雜度是o n log n 空間複雜度 氣泡排序 插入排序 希爾排序 選擇排序的空間複雜度是o 1 快速排序的...