2016年是人工智能大火的第一年,所以16年17年畢業(yè)的計(jì)算機(jī)軟件類本科生,大部分都選擇了算法相關(guān)的研究方向,nlp、cv、數(shù)據(jù)挖掘...還有大批其他專業(yè)的學(xué)生轉(zhuǎn)專業(yè)來(lái)學(xué)習(xí)計(jì)算機(jī)。越來(lái)越多人學(xué)算法,越來(lái)越多人應(yīng)聘算法,導(dǎo)致算法崗的競(jìng)爭(zhēng)壓力越來(lái)越大。
什么是算法?
算法是在有限步驟內(nèi)求解某一問(wèn)題所使用的一組定義明確的規(guī)則。通俗點(diǎn)說(shuō),就是計(jì)算機(jī)解題的過(guò)程。在這個(gè)過(guò)程中,無(wú)論是形成解題思路還是編寫(xiě)程序,都是在實(shí)施某種算法。前者是推理實(shí)現(xiàn)的算法,后者是操作實(shí)現(xiàn)的算法。
分類:
算法可大致分為基本算法、數(shù)據(jù)結(jié)構(gòu)的算法、數(shù)論與代數(shù)算法、計(jì)算幾何的算法、圖論的算法、動(dòng)態(tài)規(guī)劃以及數(shù)值分析、加密算法、排序算法、檢索算法、隨機(jī)化算法、并行算法,厄米變形模型,隨機(jī)森林算法。
一個(gè)算法應(yīng)該具有以下五個(gè)重要的特征:
1、有窮性:一個(gè)算法必須保證執(zhí)行有限步之后結(jié)束;
2、確切性:算法的每一步驟必須有確切的定義;
3、輸入:一個(gè)算法有0個(gè)或多個(gè)輸入,以刻畫(huà)運(yùn)算對(duì)象的初始情況,所謂0個(gè)輸入是指算法本身定除了初始條件;
4、輸出:一個(gè)算法有一個(gè)或多個(gè)輸出,以反映對(duì)輸入數(shù)據(jù)加工后的結(jié)果。沒(méi)有輸出的算法是毫無(wú)意義的;
5、可行性:算法中執(zhí)行的任何計(jì)算步驟都是可以被分解為基本的可執(zhí)行的操作步,即每個(gè)計(jì)算步都可以在有限時(shí)間內(nèi)完成(也稱之為有效性)
算法和程序的關(guān)系是:算法就是程序的靈魂,一個(gè)需要實(shí)現(xiàn)特定功能的程序,實(shí)現(xiàn)它的算法可以有很多種,所以算法的優(yōu)劣決定著程序的好壞。 程序就是遵循一定規(guī)則的、為完成指定工作而編寫(xiě)的代碼。有一個(gè)經(jīng)典的等式闡明了什么叫程序:程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu) + 程序設(shè)計(jì)方法 + 語(yǔ)言工具和環(huán)境 。
程序員為什么要學(xué)算法?
程序員對(duì)算法通常懷有復(fù)雜情感,算法很重要是共識(shí),但是否每個(gè)程序員都必須學(xué)算法是主要的分歧點(diǎn)。
算法對(duì)于計(jì)算機(jī)編程來(lái)說(shuō)猶如數(shù)學(xué)中數(shù)論的哥德巴赫猜想,雖然沒(méi)有那么難,但它的地方也是十分重要的。
在早期的程序員可能對(duì)與算法的感性人世不足,認(rèn)為算法的研究是那些算法工程師的事情,對(duì)于普通的編程人員的用處是很小的,其實(shí)這種想法是十分錯(cuò)誤的。
語(yǔ)言是我們走向更高級(jí)的編程的必經(jīng)之路,一個(gè)好的算法對(duì)于一個(gè)好的項(xiàng)目是至關(guān)重要的,如果不能在算法方面有自己的建樹(shù),軟件編程做到頭也就是一個(gè)碼農(nóng)而已。
究竟怎么學(xué)算法呢?


聽(tīng)說(shuō)騰訊課堂小碼哥李明杰老師推出了《每周一道算法題》課程。
如果你害怕知識(shí)太理論,無(wú)法有效輸入;如果你擔(dān)心在學(xué)習(xí)的時(shí)候不系統(tǒng),無(wú)法自己構(gòu)建知識(shí)體系;或者你覺(jué)得在學(xué)習(xí)中沒(méi)有人指導(dǎo)糾正錯(cuò)誤,學(xué)習(xí)的時(shí)候悶頭亂撞,甚至沒(méi)有學(xué)習(xí)動(dòng)力或?qū)W習(xí)氛圍??梢匀L試聽(tīng)一下。