算法簡介
大家好,今天我們開始學(xué)習(xí)一個新專題 — 算法(Algorithm)。關(guān)于算法,我們?nèi)粘i_發(fā)中有很多應(yīng)用,介紹算法的書籍也有很多,其中涉及到的知識點和信息量都很龐大,這個專題我們重點針對基于 Java 語言實現(xiàn)的算法設(shè)計和應(yīng)用進(jìn)行講解,讀者也可以自己將其擴(kuò)展到其他語言的實現(xiàn)。本文我們主要先介紹一下算法是什么?為什么要學(xué)習(xí)算法?常用的算法有哪些?
1. 什么是算法(Algorithm)?
什么是算法呢?在維基百科中這樣定義的:
在數(shù)學(xué)和計算機(jī)科學(xué)中,算法是一個有限的、定義明確的、可在計算機(jī)上實現(xiàn)的指令序列,通常是為了解決一類問題或進(jìn)行計算。算法總是不含糊的,是作為執(zhí)行計算、數(shù)據(jù)處理、自動推理等任務(wù)的規(guī)范。 — 維基百科
通俗一點來說,算法就是用來解決一類問題或者進(jìn)行計算的,但是需要有一個明確的數(shù)學(xué)或者計算機(jī)科學(xué)定義,可以在計算指令上實現(xiàn)。
2. 為什么要學(xué)習(xí)算法?
前面說到算法是有明確的數(shù)學(xué)和計算機(jī)科學(xué)定義的,那我們?yōu)槭裁匆獙W(xué)習(xí)算法了?
2.1 作為基礎(chǔ)知識
算法其實是一種通用的基礎(chǔ)知識,算法本身與任何計算機(jī)編程語言、操作系統(tǒng)等無關(guān);算法是定義良好的通用的計算過程。比如我們在學(xué)習(xí) Java 語言的時候,發(fā)現(xiàn)里面有很多關(guān)于數(shù)組(Array),集合(Set),哈希表(Map)等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)底層都涉及到了算法知識。學(xué)習(xí)算法知識有助于我們可以更好地理解編程語言的一些內(nèi)部實現(xiàn),幫助我們理解其中的函數(shù)設(shè)計思路及底層代碼實現(xiàn)邏輯。
算法作為基礎(chǔ)知識,學(xué)習(xí)算法就等于是學(xué)習(xí)數(shù)學(xué)、操作系統(tǒng)、數(shù)據(jù)庫等大學(xué)基礎(chǔ)課程一樣,有助于我們培養(yǎng)良好的計算機(jī)基礎(chǔ)理論知識,有助于自己更好的職業(yè)生涯發(fā)展。
2.2 解決實際問題
現(xiàn)實生活中的很多實際問題都可以歸結(jié)到某種算法實現(xiàn),比如我們經(jīng)常用到的地圖導(dǎo)航軟件,不知道大家有沒有思考過導(dǎo)航軟件是如何為我們規(guī)劃出出行路線規(guī)劃的了?其實里面就會涉及到算法領(lǐng)域的一些圖算法知識(這里不做過多介紹,在后續(xù)的章節(jié)里面會有詳細(xì)說明)。
還有現(xiàn)在很多的抖音小視頻 APP,大家都發(fā)現(xiàn)一不小心刷個抖音就過去了一個小時了,為什么推薦給你的小視頻會對你如此有吸引力了?其實這是因為在抖音內(nèi)部實現(xiàn)中有一套規(guī)則復(fù)雜的視頻推薦算法,可以給每個用戶推薦自身喜歡看的小視頻。
總而言之,算法知識可以用來解決現(xiàn)實生活和開發(fā)場景中的各種問題。
2.3 求職者的必備基礎(chǔ)知識
現(xiàn)在大家去一些稍微好一點大廠求職,無論你是做哪個開發(fā)崗位,如果說自己對算法知識一點都了解,估計肯定會被面試官戲弄一番了。其實,基礎(chǔ)算法知識及對應(yīng)的邏輯思維已經(jīng)成為每個互聯(lián)網(wǎng)公司招聘開發(fā)崗求職者的一個必備條件了。在 BAT 這種大廠里,算法知識可能就是技術(shù)面試中的一個極為重要的環(huán)節(jié)了。所以,學(xué)習(xí)一些算法知識,有助于我們在面試中脫穎而出。
3. 算法好壞的評價標(biāo)準(zhǔn)是什么?
當(dāng)大家針對同一個問題都各自設(shè)計出自己的算法出來時,我們?nèi)绾螌λ惴ǖ暮脡淖龀鲈u判呢?首先,算法必須是正確的,意思就是算法可以正確地解決問題。當(dāng)滿足這一前提條件之后,我們還需要哪些條件來判斷算法的好壞呢?主要有以下兩點:
- 時間復(fù)雜度 :時間復(fù)雜度就是判斷這個算法解決某個實際問題所需要花費的時間周期是多少,時間越短,說明算法設(shè)計得越好。
- 空間復(fù)雜度:空間復(fù)雜度就是說這個算法在解決實際問題時計算機(jī)設(shè)備需要消耗多少內(nèi)存空間,需要消耗的內(nèi)存空間越少,說明算法設(shè)計得越好。
當(dāng)比較算法的好壞時,我們需要在相同的實驗環(huán)境下進(jìn)行測試。同時,在日常的開發(fā)實踐中,很多時候我們在設(shè)計算法時需要綜合考慮算法的時間復(fù)雜度和空間復(fù)雜度,以便可以達(dá)到一個更好的平衡。
4. 學(xué)習(xí)基礎(chǔ)
- 學(xué)習(xí)這門課程首先至少需要會一門編程語言,最好是 Java 語言,因為接下來的示例程序會選擇用 Java 語言編寫。
- 有一定的數(shù)學(xué)基礎(chǔ),可以理解一些數(shù)學(xué)定義。