瞭解算法複雜度

算法複雜度是指算法在編寫成可執行程序後,運行時所須要的資源,資源包括時間資源和內存資源。應用於數學和計算機導論。通常編程中須要分析一段算法執行效率的時候會做爲指標來用。html

如何衡量算法的效率?一般是用資源,例如CPU(時間)佔用、內存佔用、硬盤佔用和網絡佔用。一種經常使用的衡量複雜度的效率的方法 大O表示法(O爲order的首字母的大寫) 考慮的是CPU(時間)佔用。算法

下面是分析算法時經常使用一下幾類函數:編程

  • O(1) 常數
  • O(logN) 對數
  • O(nlogN) 線性對數
  • O(n) 線性
  • O(n^2) 二次
  • O(n^c) 多項式
  • O(c^n) 指數

常數O(1)數組

function increment(num){
    return ++num;
}
複製代碼

假設運行increment(1)函數,執行事件爲X。若是再用不一樣的參數(例如10)運行一次increment函數,執行事件依然是X。和參數無關,increment函數的性能都同樣。所以,咱們說上述函數的複雜度是O(1)。bash

對數O(logN)網絡

function multiplication(num){
    var i = 1;
    while(i < num){
        i = i * 2;
    }
    return i;
}
複製代碼

從上面能夠看出,在while循環裏面,每次都講i乘以2,乘完以後,i離num愈來愈近。咱們試着求解一下,假設循環次以後i就大於num了,那這個循環就退出了,也就是2^n=num,n=log2^num,即當循環log2^num次後運行結束。所以時間複雜度爲O(logN)。數據結構

線性對數O(nlogN)
線性對數複雜度就是講複雜度爲O(logN)的函數執行n次的複雜度。函數

線性O(n)性能

function cycle(num){
    var j = 1;
    for(var i=0; i<num; i++){
        j++;
    }
    return j;
}
複製代碼

從函數邏輯能夠看出,傳入num爲1,則for循環執行1次,num爲2,執行2次,num爲10,執行10次,num爲n,執行n次。所以複雜度爲O(n).學習

二次O(n^2)
以冒泡排序爲例:

function bubbleSort(array){
    var length = array.length;
    var cost = 0;
    for(var i=0; i<length; i++){
        cost++;
        for(var j=0; j<length - 1; j++){
    	    cost++; 
            if(array[j]>array[j+1]){
                swap(array, i, j+1);   
            }
        }
     }
    console.log('cost for bubbleSort with input size '+ length +' is '+ cost);
}

function swap(array, index1, index2){
    var aux = array[index1];
    array[index1] = array[index2];
    array[index2] = aux
}
複製代碼

傳入大小爲10的數組,執行開銷是10(10-1)+10,即10^2,傳入大小爲100的數組,執行開銷是100(100-1)+100,即100^2。則複雜度爲O(n^2)。

多項式O(n^c)
參考複雜度O(n^2)去理解,冪不是2,而是一個動態值。

指數O(c^n)
參考複雜度O(n^2)去理解,基數和冪是一個動態值。

參考資料

相關文章
相關標籤/搜索