“一流程序員靠數(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é),。” 數(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ì)簡(jiǎn)單的子問題的方式求解復(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)樗雌饋硐褚豢玫箳斓臉洌簿褪钦f它是根朝上,,而葉朝下的,。 它具有以下的特點(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)而外地講了出來,并分析它們?cè)诰幊讨械膽?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é)的重要,。“ “希望我那淺薄的數(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)在就想開始改變了,。”再渺小的人物也有遠(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.提供源代碼下載,。 參考來源: |
|