摘要:你需要知道的算法之基礎(chǔ)篇前言很多時候我們都會感慨要是當(dāng)時了多好啊,現(xiàn)在也不至于這樣難堪了。但是我們不可能又沒必要對每個算法進行測試,只需要知道大概的哪個算法執(zhí)行所花費的時間多,哪個花費的時間少就行了。
你需要知道的算法之基礎(chǔ)篇 0 - 前言
很多時候我們都會感慨:要是當(dāng)時×××了多好啊,現(xiàn)在也不至于這樣難堪了。
后悔的時候千千萬,一覺醒來過眼云煙。
我也和蕓蕓眾生一樣在學(xué)校的時候沒有好好的理解思考一些東西,等到了真正需要用的時候才知道書到用時方恨少。有道是知錯能改,那為什么有道 == 知錯能改呢?下面請允許我開始真正的內(nèi)容:
本文通篇都是一些概念,但是你需要知道這些更有利于理解時間復(fù)雜度等一些概念是什么、怎么來的、為什么需要這個東西(what、where、why)。1 - 算法
算法的定義是這樣的:解題方案的準(zhǔn)確而完善的描述,是一系列解決問題的清晰指令。巴拉巴拉的,雖然是一小句但還是不想看(題外話:有時候吧專業(yè)名詞記下來面試的時候還是挺有用的),其實就是解決一個問題的完整性描述。只不過這個描述就可能是用不同的方式或者說是“語言”了。
2 - 算法的效率既然算法是解決問題的描述,那么就像一千個人眼中有一千個阿姆雷特他大姨夫一樣,解決同一個問題的辦法也是多種多樣的,只是在這過程中我們所使用/消耗的時間或者時間以外的代價(計算機消耗的則為內(nèi)存了)不一樣。為了更快、更好、更強的發(fā)揚奧利奧..哦不,提高算法的效率。所以很多時候一個優(yōu)秀的算法就在于它與其他實現(xiàn)同一個問題的算法相比,在時間或空間(內(nèi)存)或者時間和空間(內(nèi)存)上都得到明顯的降低。
所以呢,算法的效率主要由以下兩個復(fù)雜度來評估:
時間復(fù)雜度:評估執(zhí)行程序所需的時間??梢怨浪愠龀绦?qū)μ幚砥鞯氖褂贸潭取?/p>
空間復(fù)雜度:評估執(zhí)行程序所需的存儲空間??梢怨浪愠龀绦?qū)τ嬎銠C內(nèi)存的使用程度。
設(shè)計算法時,時間復(fù)雜度要比空間復(fù)雜度更容易出問題,所以一般情況一下我們只對時間復(fù)雜度進行研究。一般面試或者工作的時候沒有特別說明的話,復(fù)雜度就是指時間復(fù)雜度。
2.0 - 時間復(fù)雜度接下來我們還需要知道另一個概念:時間頻度。這個時候你可能會說:“不是說好一起學(xué)算法嗎,這些東東是什么?贈品嗎?”。非也非也,這是非賣品。
因為一個算法執(zhí)行所消耗的時間理論上是不能算出來的,沒錯正是理論上,so我們?nèi)稳豢梢栽诔绦蛑袦y試獲得。但是我們不可能又沒必要對每個算法進行測試,只需要知道大概的哪個算法執(zhí)行所花費的時間多,哪個花費的時間少就行了。如果一個算法所花費的時間與算法中代碼語句執(zhí)行次數(shù)成正比,那么那個算法執(zhí)行語句越多,它的花費時間也就越多。我們把一個算法中的語句執(zhí)行次數(shù)稱為時間頻度。通常(ps:很想知道通常是誰)用T(n)表示。
在時間頻度T(n)中,n又代表著問題的規(guī)模,當(dāng)n不斷變化時,T(n)也會不斷地隨之變化。為了了解這個變化的規(guī)律,時間復(fù)雜度這一概念就被引入了。一般情況下算法基礎(chǔ)本操作的重復(fù)執(zhí)行次數(shù)為問題規(guī)模n的某個函數(shù),用也就是時間頻度T(n)。如果有某個輔助函數(shù)f(n),當(dāng)趨于無窮大的時候,T(n)/f(n)的極限值是不為零的某個常數(shù),那么f(n)是T(n)的同數(shù)量級函數(shù),記作T(n)=O(f(n)),被稱為算法的漸進時間復(fù)雜度,又簡稱為時間復(fù)雜度。
2.1 - 大O表示法用O(n)來體現(xiàn)算法時間復(fù)雜度的記法被稱作大O表示法
一般我們我們評估一個算法都是直接評估它的最壞的復(fù)雜度。
大O表示法O(f(n))中的f(n)的值可以為1、n、logn、n^2 等,所以我們將O(1)、O(n)、O(logn)、O( n^2 )分別稱為常數(shù)階、線性階、對數(shù)階和平方階。下面我們來看看推導(dǎo)大O階的方法:
推導(dǎo)大O階
推導(dǎo)大O階有一下三種規(guī)則:
用常數(shù)1取代運行時間中的所有加法常數(shù)
只保留最高階項
去除最高階的常數(shù)
舉好多栗子
常數(shù)階
let sum = 0, n = 10; // 語句執(zhí)行一次 let sum = (1+n)*n/2; // 語句執(zhí)行一次 console.log(`The sum is : ${sum}`) //語句執(zhí)行一次
這樣的一段代碼它的執(zhí)行次數(shù)為 3 ,然后我們套用規(guī)則1,則這個算法的時間復(fù)雜度為O(1),也就是常數(shù)階。
線性階
let i =0; // 語句執(zhí)行一次 while (i < n) { // 語句執(zhí)行n次 console.log(`Current i is ${i}`); //語句執(zhí)行n次 i++; // 語句執(zhí)行n次 }
這個算法中代碼總共執(zhí)行了 3n + 1次,根據(jù)規(guī)則 2->3,因此該算法的時間復(fù)雜度是O(n)。
對數(shù)階
let number = 1; // 語句執(zhí)行一次 while (number < n) { // 語句執(zhí)行l(wèi)ogn次 number *= 2; // 語句執(zhí)行l(wèi)ogn次 }
上面的算法中,number每次都放大兩倍,我們假設(shè)這個循環(huán)體執(zhí)行了m次,那么2^m = n即m = logn,所以整段代碼執(zhí)行次數(shù)為1 + 2*logn,則f(n) = logn,時間復(fù)雜度為O(logn)。
平方階
for (let i = 0; i < n; i++) { // 語句執(zhí)行n次 for (let j = 0; j < n; j++) { // 語句執(zhí)行n^2次 console.log("I am here!"); // 語句執(zhí)行n^2 } }
上面的嵌套循環(huán)中,代碼共執(zhí)行 2*n^2 + n,則f(n) = n^2。所以該算法的時間復(fù)雜度為O(n^2 )
常見時間復(fù)雜度的比較
常見的時間復(fù)雜度函數(shù)相信大家在大學(xué)中都已經(jīng)見過了,這里也不多做解釋了:
O(1) 從今天開始,我會好好的把之前很多自己沒有去理解的各種基礎(chǔ)、底層知識好好的嚼幾遍。與諸君共勉! 原文地址:點擊此處曾經(jīng)有一份能夠在學(xué)校好好學(xué)算法的機會,我沒有好好珍惜,直到失去的時候我才追悔莫及。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92192.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習(xí)。因為我心理很清楚,我的目標(biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學(xué)習(xí)計劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:寫本文的目的,希望結(jié)合眾家之長,試圖解決數(shù)學(xué)對機器學(xué)習(xí)入門的困擾。這里假設(shè)你上過大學(xué)的數(shù)學(xué)課,你就具備了機器學(xué)習(xí)的數(shù)學(xué)入門門檻了,之后的數(shù)學(xué)啃一啃是可以下來的。 寫這篇文章很久想了很久,到底該怎么寫? 關(guān)于數(shù)學(xué)與機器學(xué)習(xí)的關(guān)系,觀點很多。 寫本文的目的,希望結(jié)合眾家之長,試圖解決數(shù)學(xué)對機器學(xué)習(xí)入門的困擾。 現(xiàn)在數(shù)學(xué)困擾大家主要有這幾個方面: 1、 機器學(xué)習(xí)需要的數(shù)學(xué)知識是不是很難,網(wǎng)上...
摘要:寫本文的目的,希望結(jié)合眾家之長,試圖解決數(shù)學(xué)對機器學(xué)習(xí)入門的困擾。這里假設(shè)你上過大學(xué)的數(shù)學(xué)課,你就具備了機器學(xué)習(xí)的數(shù)學(xué)入門門檻了,之后的數(shù)學(xué)啃一啃是可以下來的。 寫這篇文章很久想了很久,到底該怎么寫? 關(guān)于數(shù)學(xué)與機器學(xué)習(xí)的關(guān)系,觀點很多。 寫本文的目的,希望結(jié)合眾家之長,試圖解決數(shù)學(xué)對機器學(xué)習(xí)入門的困擾。 現(xiàn)在數(shù)學(xué)困擾大家主要有這幾個方面: 1、 機器學(xué)習(xí)需要的數(shù)學(xué)知識是不是很難,網(wǎng)上...
閱讀 2064·2021-09-07 10:14
閱讀 1494·2019-08-30 15:53
閱讀 2282·2019-08-30 12:43
閱讀 2875·2019-08-29 16:37
閱讀 768·2019-08-26 13:29
閱讀 2016·2019-08-26 13:28
閱讀 451·2019-08-23 18:33
閱讀 3539·2019-08-23 16:09