大O表示法

討論算法必提到O(),不太懂,嘗試?yán)斫庖幌隆?/p>

大O表示法

描述算法的性能和復(fù)雜度。常用O表示。一般考慮為cpu時(shí)間占用。

WX20170331-145138.png

1.O(1)

算法執(zhí)行時(shí)間和參數(shù)無(wú)關(guān),函數(shù)性能一樣,時(shí)間復(fù)雜度稱(chēng)為O(1)。
例:

function increaseNum(num){
    return ++num
}

假如執(zhí)行時(shí)間為x,不管傳入任何值,執(zhí)行時(shí)間都是x。

2.O(n)

O(n),算法的執(zhí)行時(shí)間呈線(xiàn)性關(guān)系。如果你有 100 個(gè)元素,這種算法就要做 100 次工作。數(shù)據(jù)量翻倍那么運(yùn)行時(shí)間也翻倍。例子:線(xiàn)性查找。

function search(array, item) {
    var cost = 0;
    for (var i = 0; i < array.length; i++) {
        cost++;
        if (item === array[i]) {
            return i;
        }
    }

}

時(shí)間花費(fèi)cost和輸入的array有關(guān),呈線(xiàn)性關(guān)系。尋找item要把a(bǔ)rray遍歷一次。

3.O(n^2)

O(n^2 ), 有點(diǎn)慢。如果你有 100 個(gè)元素,這種算法需要做 100^2 = 10000 次工作。數(shù)據(jù)量 x 2 會(huì)導(dǎo)致運(yùn)行時(shí)間 x 4 (因?yàn)?2 的 2 次方等于 4)。例子:循環(huán)套循環(huán)的算法,比如插入排序。

//數(shù)組的交換,所以要引入index1,index2.數(shù)組內(nèi)部元素的交換
function swap(array, index1, index2) {
    var aux = array[index1];
    array[index1] = array[index2];
    array[index2] = aux;
}
//冒泡排序O(n^2)
function bubbleSort(array) {
    var length = array.length;
    for (var i = 0; i < length; i++) {
        for (var j = 0; j < length - 1; j++) {
            if (array[j] > array[j + 1]) {
                swap(array, j, j + 1);
            }
        }
    }
    return array;
}

大部分情況下你用直覺(jué)就可以知道一個(gè)算法的大 O 表示法。比如說(shuō),如果你的代碼用一個(gè)循環(huán)遍歷你輸入的每個(gè)元素,那么這個(gè)算法就是 O(n)。如果是循環(huán)套循環(huán),那就是 O(n^2)。如果 3 個(gè)循環(huán)套在一起就是 O(n^3),以此類(lèi)推。

注意,大 O 表示法只是一種估算,當(dāng)數(shù)據(jù)量大的時(shí)候才有用。舉個(gè)例子,[插入排序](Insertion Sort/)的最糟情況運(yùn)行時(shí)間是 O(n^2)。 理論上來(lái)說(shuō)它的運(yùn)行時(shí)間比[歸并排序](Merge Sort/)要慢一些。歸并排序是 O(n log n)。但對(duì)于小數(shù)據(jù)量,插入排序?qū)嶋H上更快一些,特別是那些已經(jīng)有一部分?jǐn)?shù)據(jù)是排序好的數(shù)組。

如果你看完沒(méi)懂,也不要太糾結(jié)了。這種東西僅僅在比較兩種算法哪種更好的時(shí)候才有點(diǎn)用。但歸根結(jié)底,你還是要實(shí)際測(cè)試之后才能得出結(jié)論。而且如果數(shù)據(jù)量相對(duì)較小,哪怕算法比較慢,在實(shí)際使用也不會(huì)造成太大的問(wèn)題。

參考資料:

  • 《學(xué)習(xí)javascript數(shù)據(jù)結(jié)構(gòu)和算法》
  • 大 O 表示法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容