“一流程序員靠數(shù)學(xué),二流靠算法,三流靠邏輯,四流靠SDK,五流靠Google和StackOverFlow,六流靠百度和CSDN。低端的看高端的就是黑魔法!” 雖然是段子,但其實(shí)也挺寫實(shí)的,因?yàn)槟愦蜷_各大招聘網(wǎng)站,會(huì)發(fā)現(xiàn)越是高薪的IT崗位,對(duì)數(shù)學(xué)的要求越高。其實(shí),我曾經(jīng)也不太明白數(shù)學(xué)為什么對(duì)程序員很重要,不明白為什么在大學(xué)里初入編程之門時(shí),老師卻要求你去看《數(shù)學(xué)之美》。 但后來,我有幸閱讀了計(jì)算機(jī)大佬黃申寫的《程序員的數(shù)學(xué)基礎(chǔ)課 從理論到Python實(shí)踐》一書,才意識(shí)到數(shù)學(xué)對(duì)于程序員的重要性。 ▲ 本書現(xiàn)在當(dāng)當(dāng)/京東都5折半價(jià)活動(dòng), 剛興趣的讀者可以在文末鏈接參與 上大學(xué)的時(shí)候,我非常喜歡編程,不喜歡待在教室里聽數(shù)學(xué)老師講那些枯燥的數(shù)學(xué)理論和定理。再到后來,我讀了碩士和博士,開始接觸更多的算法和機(jī)器學(xué)習(xí),猛然間才發(fā)現(xiàn)機(jī)器學(xué)習(xí)表面上是“寫程序”,剝?nèi)ネ獗恚?strong>本質(zhì)上是在研究數(shù)學(xué)?!?/p> 數(shù)學(xué)不僅僅是程序員的工具,更是從低端向高端進(jìn)階的黑魔法。那么如何學(xué)好數(shù)學(xué)給自己夯實(shí)好進(jìn)階的臺(tái)階呢?在《程序員的數(shù)學(xué)基礎(chǔ)課 從理論到Python實(shí)踐》這本書中,你一定可以找到答案! 程序員的數(shù)學(xué)思維很重要! 在V2EX論壇上有一個(gè)帖子一直掛著一個(gè)帖子,這個(gè)帖子的問題是“數(shù)學(xué)對(duì)程序員來說真的很重要嗎?”這個(gè)帖子下經(jīng)常有人來更新,回答的內(nèi)容幾乎都是說數(shù)學(xué)對(duì)于程序員來說十分重要。 其中,有一位網(wǎng)友的回答令我記憶尤深。 “懂?dāng)?shù)學(xué)的才能叫程序員,不懂的只能停留在碼農(nóng)級(jí)別,這不是說你編碼用不用數(shù)學(xué),數(shù)學(xué)本身就是邏輯思維的能力?!边@個(gè)回答說得太好了!不僅一針見血地指出了程序員之間出現(xiàn)的等級(jí)差距,還進(jìn)一步揭示了造成這種差距的原因——缺乏數(shù)學(xué)思維。 顯而易見,程序員如果缺乏數(shù)學(xué)思維會(huì)使自己處于劣處,造成天平的失衡。 正如本書中,以作者黃申多年的工作經(jīng)歷來看,數(shù)學(xué)學(xué)得好不好將會(huì)直接決定一個(gè)程序員有沒有發(fā)展?jié)摿?。往大了說,數(shù)學(xué)是一種思維模式,考驗(yàn)的是一個(gè)人歸納、總結(jié)和抽象的能力。 將這個(gè)能力放到程序員的世界里,其實(shí)就是解決問題的能力。往小了說,不管是數(shù)據(jù)結(jié)構(gòu)與算法還是程序設(shè)計(jì),其實(shí)底層很多原理或者思路都源自數(shù)學(xué),所以很多大公司在招人時(shí)也會(huì)優(yōu)先考慮數(shù)學(xué)專業(yè)的畢業(yè)生,因?yàn)檫@些人的數(shù)學(xué)基礎(chǔ)很好,學(xué)起編程來也容易上手。 如果編程語言是血肉,那么數(shù)學(xué)的思想和知識(shí)就是靈魂。它可以幫助你選擇合適的數(shù)據(jù)結(jié) 構(gòu)和算法,提升系統(tǒng)效率,并且賦予機(jī)器智慧。在大數(shù)據(jù)和智能化的時(shí)代更是如此。 總而言之,數(shù)學(xué)決定了一個(gè)人技術(shù)上能發(fā)展的上限,它對(duì)程序員來說意義非凡! 程序員學(xué)數(shù)學(xué)需要掌握的基礎(chǔ)思想 既然程序員的數(shù)學(xué)思維如此重要,那么程序員學(xué)數(shù)學(xué)需要掌握哪些基礎(chǔ)思想呢? 二進(jìn)制 二進(jìn)制(binary)在數(shù)學(xué)和數(shù)字電路中指以2為基數(shù)的記數(shù)系統(tǒng),以2為基數(shù)代表系統(tǒng)是二進(jìn)位制的。這一系統(tǒng)中,通常用兩個(gè)不同的數(shù)字0和1來表示。 二進(jìn)制是計(jì)算機(jī)系統(tǒng)的基礎(chǔ),數(shù)字電子電路中,邏輯門直接采用了二進(jìn)制,因此現(xiàn)代的計(jì)算機(jī)和依賴計(jì)算機(jī)的設(shè)備里都用到二進(jìn)制。每個(gè)數(shù)字稱為一個(gè)比特(Bit,Binary digit 的縮寫)。 (二進(jìn)制) 余數(shù) 余數(shù)就是指整數(shù)除法中被除數(shù)未被除盡的部分,且余數(shù)的取值范圍為 0 到除數(shù)之間(不包括除數(shù)自身)。取余數(shù)運(yùn)算 a mod b = c(b不為0)表示整數(shù)a除以整數(shù)b所得余數(shù)為c。例如:32÷5= 6…2,更專業(yè)的符號(hào)也可以寫作 32÷5=6 又 2/5,或者32 mod 5=2。 可不要小看余數(shù),無論是在日常生活中,還是計(jì)算機(jī)領(lǐng)域中,它都發(fā)揮著重要的作用。當(dāng)然,計(jì)算機(jī)中的余數(shù)思想大多被運(yùn)用在很多常見的算法和數(shù)據(jù)結(jié)構(gòu)中,而且有可能你在不知情情況下就運(yùn)用到它。 (求余數(shù)) 布爾代數(shù) 布爾代數(shù)是一個(gè)用于集合運(yùn)算和邏輯運(yùn)算的公式:〈B,∨,∧,? 〉。其中B為一個(gè)非空集合,∨,∧為定義在B上的兩個(gè)二元運(yùn)算,?為定義在B上的一個(gè)一元運(yùn)算。通過布爾代數(shù)進(jìn)行集合運(yùn)算可以獲取到不同集合之間的交集、并集或補(bǔ)集,進(jìn)行邏輯運(yùn)算可以對(duì)不同集合進(jìn)行與、或、非。 可以說,布爾代數(shù)算是編程中控制邏輯的靈魂。因?yàn)檎嬷悼梢栽谶壿嬰娐分斜硎緸槎M(jìn)制數(shù)數(shù)或電平,這種相似性同樣擴(kuò)展到它們,所以布爾代數(shù)在電子工程和計(jì)算機(jī)科學(xué)中同在數(shù)理邏輯中一樣有很多實(shí)踐應(yīng)用。在電子工程領(lǐng)域?qū)iT化了的布爾代數(shù)也叫做邏輯代數(shù),在計(jì)算機(jī)科學(xué)領(lǐng)域?qū)iT化了布爾代數(shù)也叫做布爾邏輯。 (布爾代數(shù)) 迭代 迭代是重復(fù)反饋過程的活動(dòng),其目的通常是為了接近并到達(dá)所需的目標(biāo)或結(jié)果。每一次對(duì)過程的重復(fù)被稱為一次“迭代”,而每一次迭代得到的結(jié)果會(huì)被用來作為下一次迭代的初始值。 數(shù)學(xué)中的迭代可以指函數(shù)迭代的過程,即反復(fù)地運(yùn)用同一函數(shù)計(jì)算,前一次迭代得到的結(jié)果被用于作為下一次迭代的輸入。 在計(jì)算機(jī)科學(xué)中,迭代是程序中對(duì)一組指令(或一定步驟)的重復(fù)。它既可以被用作通用的術(shù)語(與“重復(fù)”同義),也可以用來描述一種特定形式的具有可變狀態(tài)的重復(fù)。 將迭代法和計(jì)算機(jī)強(qiáng)大的處理能力相結(jié)合,我們能創(chuàng)造出很有價(jià)值的數(shù)據(jù)結(jié)構(gòu)和算法。 (一個(gè)五邊形的迭代。將對(duì)角用直線段連起來得到一個(gè)五角星,后者中心圍成了一個(gè)倒過來的小五邊形。迭代地執(zhí)行這一過程會(huì)產(chǎn)生一系列嵌套的五邊形和五角星。) 遞歸 遞歸(Recursion),在數(shù)學(xué)與計(jì)算機(jī)科學(xué)中,是指在函數(shù)的定義中使用函數(shù)自身的方法。遞歸一詞還較常用于描述以自相似方法重復(fù)事物的過程。例如,當(dāng)兩面鏡子相互之間近似平行時(shí),鏡中嵌套的圖像是以無限遞歸的形式出現(xiàn)的。也可以理解為自我復(fù)制的過程。 程序調(diào)用自身的編程技巧稱為遞歸。遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。一個(gè)過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。 遞歸的能力在于用有限的語句來定義對(duì)象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。 (德羅斯特效應(yīng)是遞歸的一種視覺形式。圖中女性手持的物體中有一幅她本人手持同一物體的小圖片,進(jìn)而小圖片中還有更小的一幅她手持同一物體的圖片,依此類推。) 數(shù)學(xué)歸納法 數(shù)學(xué)歸納法(Mathematical Induction、MI、ID)是一種數(shù)學(xué)證明方法,通常被用于證明某個(gè)給定命題在整個(gè)(或者局部)自然數(shù)范圍內(nèi)成立。除了自然數(shù)以外,廣義上的數(shù)學(xué)歸納法也可以用于證明一般良基結(jié)構(gòu),例如:集合論中的樹。這種廣義的數(shù)學(xué)歸納法應(yīng)用于數(shù)學(xué)邏輯和計(jì)算機(jī)科學(xué)領(lǐng)域,稱作結(jié)構(gòu)歸納法。 (多米諾骨牌效應(yīng):骨牌一個(gè)接一個(gè)倒下, 就如同一個(gè)值到下一個(gè)值的過程) 迭代和遞歸,以及與它們相關(guān)的數(shù)學(xué)歸納,是和基礎(chǔ)編程關(guān)系非常緊密的。迭代法和遞歸都是通過不斷反復(fù)的步驟,計(jì)算數(shù)值或進(jìn)行操作的方法。迭代一般適合正向思維,而遞歸一般適合逆向思維。而遞歸回溯的時(shí)候,也體現(xiàn)了正向遞推的思維。它們本身都是抽象的流程,可以由不同的編程實(shí)現(xiàn)。 排列和組合 排列(permutation),一般地,從n個(gè)不同元素中取出m(m≤n)個(gè)元素,按照一定的順序排成一列,叫做從n個(gè)元素中取出m個(gè)元素的一個(gè)排列。特別地,當(dāng)m=n時(shí),這個(gè)排列被稱作全排列(all permutation)。 組合(combination),是一個(gè)數(shù)學(xué)名詞。一般地,從n個(gè)不同的元素中,任取m(m≤n)個(gè)元素為一組,叫作從n個(gè)不同元素中取出m個(gè)元素的一個(gè)組合。我們把有關(guān)求組合的個(gè)數(shù)的問題叫作組合問題。 動(dòng)態(tài)規(guī)劃 動(dòng)態(tài)規(guī)劃(Dynamic Programming,DP),是一種在數(shù)學(xué)、管理科學(xué)、計(jì)算機(jī)科學(xué)、經(jīng)濟(jì)學(xué)和生物信息學(xué)中使用的,通過把原問題分解為相對(duì)簡單的子問題的方式求解復(fù)雜問題的方法,是求解決策過程最優(yōu)化的過程。 20世紀(jì)50年代初,美國數(shù)學(xué)家貝爾曼等人在研究多階段決策過程的優(yōu)化問題時(shí),提出了著名的最優(yōu)化原理,從而創(chuàng)立了動(dòng)態(tài)規(guī)劃。動(dòng)態(tài)規(guī)劃能減少不必要的排列 和組合,最終大幅提升算法的性能。 (算法中的動(dòng)態(tài)規(guī)劃問題) 樹 樹是圖論中最重要的概念之一,也是一種數(shù)據(jù)結(jié)構(gòu),它是由n(n>=1)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做“樹”是因?yàn)樗雌饋硐褚豢玫箳斓臉?,也就是說它是根朝上,而葉朝下的。 它具有以下的特點(diǎn):每個(gè)結(jié)點(diǎn)有零個(gè)或多個(gè)子結(jié)點(diǎn);沒有父結(jié)點(diǎn)的結(jié)點(diǎn)稱為根結(jié)點(diǎn);每一個(gè)非根結(jié)點(diǎn)有且只有一個(gè)父結(jié)點(diǎn);除了根結(jié)點(diǎn)外,每個(gè)子結(jié)點(diǎn)可以分為多個(gè)不相交的子樹。 (數(shù)據(jù)結(jié)構(gòu)中的樹存儲(chǔ)結(jié)構(gòu)) 圖 在數(shù)學(xué)的分支圖論中,圖(Graph)用于表示物件與物件之間的關(guān)系,是圖論的基本研究對(duì)象。一張圖由一些小圓點(diǎn)(稱為頂點(diǎn)或結(jié)點(diǎn))和連結(jié)這些圓點(diǎn)的直線或曲線(稱為邊)組成。 圖是一種多對(duì)多的數(shù)據(jù)結(jié)構(gòu),比線性表和樹更復(fù)雜,它由頂點(diǎn)的有窮非空集合和頂點(diǎn)之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個(gè)圖,V是圖G中頂點(diǎn)的集合,E是圖G中邊的集合。 (一個(gè)有六個(gè)頂點(diǎn),七個(gè)邊的圖) ...... 《程序員的數(shù)學(xué)基礎(chǔ)課》如何能幫你搞定數(shù)學(xué)? 可能有的人看到上面那些數(shù)學(xué)的基礎(chǔ)思想,就開始感到煩躁。 畢竟數(shù)學(xué)是個(gè)博大精深的學(xué)科,有些數(shù)學(xué)名詞光是耳聞或目睹就開始令人撤退,但我們的目標(biāo)不是成為數(shù)學(xué)集大成者,只要學(xué)好程序員所需要的數(shù)學(xué),就足以培養(yǎng)好數(shù)學(xué)思維,逐步跨越等級(jí)鴻溝。 為此,本書的作者黃申也在書中,循序漸進(jìn),巧立重點(diǎn)——“程序員需要學(xué)的數(shù)學(xué)知識(shí)”,讓數(shù)學(xué)變得更加容易學(xué)習(xí),程序員們也更快理解數(shù)學(xué)思維。 首先,他梳理了編程中常用的數(shù)學(xué)概念, 由淺入深剖析它們的本質(zhì),希望能夠幫程序員讀者徹底掌握這些基礎(chǔ)、核心的數(shù)學(xué)知識(shí)。這其中包括那些曾經(jīng)熟悉的數(shù)學(xué)名詞,如數(shù)學(xué)歸納法、迭代法、遞歸、排列、組合等。 其次,他將線性代數(shù)和概率統(tǒng)計(jì)中的抽象概念、公式、定理都由內(nèi)而外地講了出來,并分析它們在編程中的應(yīng)用案例,幫助程序員讀者提升編程的高階能力。對(duì)于這些內(nèi)容,他從基本的概念入手,結(jié)合生活和工作中的實(shí)際案例,讓程序員讀者更輕松地理解概念的含義。 按照這樣的講解路線,既能讓程序員讀者鞏固基礎(chǔ)的概念和知識(shí),同時(shí)又能讓他們明白這些基礎(chǔ)性的內(nèi)容,對(duì)計(jì)算機(jī)編程和算法究竟意味著什么。 總而言之,這本書的內(nèi)容從概念到應(yīng)用,再到本質(zhì),層層深入,不但注重培養(yǎng)讀者養(yǎng)成良好的數(shù)學(xué)思維,而且努力使讀者的編程技術(shù)實(shí)現(xiàn)進(jìn)階,非常適合希望從本質(zhì)上提升編程質(zhì)量的中級(jí)程序員閱讀和學(xué)習(xí)。 值得一提的是,這本書的作者黃申之前在網(wǎng)站上開過一堂以本書內(nèi)容為主的課程,贏得好聲一片。網(wǎng)友們紛紛評(píng)論: “希望大神能帶我入門!” “工作幾年,越來越覺得數(shù)學(xué)重要” “在游戲領(lǐng)域做了8年了,越來越覺得數(shù)學(xué)的重要?!?/p> “希望我那淺薄的數(shù)學(xué)底子能跟得上,堅(jiān)持堅(jiān)持!' “希望自己能學(xué)到點(diǎn),數(shù)學(xué)虐我千百遍,我待數(shù)學(xué)如初戀!” “自己在學(xué)習(xí)算法與數(shù)據(jù)結(jié)構(gòu)時(shí),就遇到了基本的數(shù)學(xué)思想與計(jì)算公式,來計(jì)算時(shí)間復(fù)雜度。需要從新拿起數(shù)學(xué),正想著看視頻學(xué)習(xí)高數(shù),但學(xué)的又太多與編程無關(guān)的知識(shí),太浪費(fèi)時(shí)間,這樣的專欄果斷下單,跟著大神學(xué)習(xí),提高效率,降低成本,時(shí)間太重要!” “第一時(shí)間購買,數(shù)據(jù)結(jié)構(gòu)和算法很重要,但是很多算法又離不開數(shù)學(xué)!” “已經(jīng)迫不及待了!” ...... 而其中,也有一位讀者的留言讓我頗為感動(dòng): “可能我一輩子也沒法成為頂級(jí)程序員,可我現(xiàn)在就想開始改變了?!?/strong>再渺小的人物也有遠(yuǎn)大的志向,不論我們身處程序員哪一等級(jí),只要我們心中有光,并為之努力奮斗,便都是頂級(jí)人才!就讓這本程序員補(bǔ)數(shù)學(xué)的絕佳伴侶《程序員的數(shù)學(xué)基礎(chǔ)課 從理論到Python實(shí)踐》陪伴著我們一同前行,創(chuàng)造黑魔法,成為優(yōu)秀的程序魔導(dǎo)師吧! 加油!相信自己! (圖靈獎(jiǎng)) 1.緊緊圍繞程序員的需求。 數(shù)學(xué)的課題非常廣泛,但本書沒有涉及數(shù)學(xué)領(lǐng)域的全部課題,而是從程序員的需求出發(fā),精心挑選了編程所需的常用知識(shí)點(diǎn),并實(shí)現(xiàn)學(xué)以致用。 2.結(jié)合生動(dòng)的案例和形象的比喻解讀難點(diǎn)。 降低技術(shù)理解的門檻,讓程序員更容易理解數(shù)學(xué)背后的邏輯,并對(duì)實(shí)際生產(chǎn)問題進(jìn)行數(shù)學(xué)建模,進(jìn)而設(shè)計(jì)出更有效的算法,編寫出更優(yōu)雅的代碼。 3.注重編程實(shí)踐。 除了闡述理論知識(shí),書中還提供了要通過大量實(shí)踐才能積累的寶貴經(jīng)驗(yàn),讓讀者有機(jī)會(huì)親自動(dòng)手編寫Python 代碼,進(jìn)而加深理解。 4.提供源代碼下載。 參考來源: |
|