聲明:算法和數(shù)據(jù)結(jié)構(gòu)的文章均是作者從github上翻譯過(guò)來(lái)光绕,為方便大家閱讀茄靠。如果英語(yǔ)閱讀能力強(qiáng)的朋友秕岛,可以直接到swift算法俱樂(lè)部查看所有原文寿弱,以便快速學(xué)習(xí)。作者同時(shí)也在學(xué)習(xí)中才睹,歡迎交流。
在編程過(guò)程中,了解一個(gè)算法的速度和消耗內(nèi)存是非常有用的揪阿,它可以讓你在不同的情況選擇合適的算法。
通過(guò)大O符號(hào)可以讓你對(duì)算法的運(yùn)行速度和內(nèi)存消耗有粗略的判斷咆畏。當(dāng)有人說(shuō):“這個(gè)算法比O(n^2)跑得慢南捂,占用了O(n)的空間【烧遥”他們的意思是溺健,這個(gè)算法有點(diǎn)慢,但是不需要太多額外的內(nèi)存钮蛛。
理解算法的大O符號(hào)通常是經(jīng)過(guò)數(shù)學(xué)分析鞭缭。這里我們不討論數(shù)學(xué)剖膳,但是了解不同的值所代表的意思還是有必要的,如下圖岭辣。N代表你在處理的數(shù)據(jù)總量吱晒。比如,排序一個(gè)含有100個(gè)元素的數(shù)組沦童,n=100仑濒。
通常情況下你不需要用數(shù)學(xué)推理去知道一個(gè)算法的大O,只需要簡(jiǎn)單的憑自覺(jué)搞动。如果你的代碼使用的是單一循環(huán)來(lái)查看所有的輸入數(shù)據(jù)躏精,那這個(gè)算法就是O(n)。如果你的代碼使用的是兩層嵌套循環(huán)鹦肿,那這個(gè)算法就是O(n^2)矗烛。三次嵌套循環(huán)就是O(n^3),以此類(lèi)推箩溃。
必須注意大O符號(hào)只是一個(gè)大致判斷瞭吃,同時(shí)它只適合數(shù)據(jù)總量大的情況。比如涣旨,對(duì)于插入排序算法O(n^2)是屬于運(yùn)行時(shí)間較長(zhǎng)的歪架,理論上會(huì)比歸類(lèi)排序算法O(nlogn)來(lái)的更久。但是在小數(shù)據(jù)總量的時(shí)候霹陡,插入排序算法卻比歸類(lèi)排序算法更快和蚪,特別是當(dāng)數(shù)組已經(jīng)是部分排序好的情況下!
如果你感覺(jué)很迷惑烹棉,請(qǐng)不要讓大o符號(hào)困擾你太多攒霹。在對(duì)比兩個(gè)算法的優(yōu)劣時(shí)候它是非常有用的!重點(diǎn)是要不斷的去嘗試浆洗。當(dāng)然催束,在數(shù)據(jù)總量很小的時(shí)候,即使是實(shí)際應(yīng)用伏社,一個(gè)糟糕的算法也可以取得不錯(cuò)的效果抠刺。