標籤:

想學好計算機演算法,是否需要重新學數學呢?

一直羨慕演算法好的人,曾經不知道多少次拿起《演算法導論》,然後又放下。畢業多年,之前從事的就是寫一些沒有什麼技術含量的程序。一直都想把演算法學好,但又不知從何開始。我從高中以來數學就不好了,在大學時候學的高等數學和線性代數還不錯,但現在也全部忘光了。去年又花了快一年的時間去學離散數學,但感覺啟發不大。

這種對學好演算法渴望持續了很久,非常想去那種在線OJ刷一些有難度的題,求教各位演算法好的大拿,我應該從哪裡開始?


要學什麼,就學什麼。

要學演算法,就學演算法,遇到數學問題,就查,就問,不要分心。

要參加英文面試,就練習英文面試,別背單詞,別練閱讀,也不用管面試中說不到的話題。

要做什麼,就準備什麼。寧可簡單粗暴,不要曲線救國。攤子鋪大了,目標就模糊了,效率低,反饋慢,漸漸的就兜不回來了。


非常想去,為什麼還不去做?

基本演算法與數據結構:
程序員必須掌握哪些演算法? - SimonS 的回答

機器學習:
怎麼用最短時間高效而踏實的學習python? - SimonS 的回答

同意 @mu peng的說法,你可以給自己建一個項目,比如去豆瓣抓取用戶的觀影信息,然後自己做一個電影推薦系統。這當中就會涉及到線性代數的各種矩陣計算及優化,統計學中的一些概念比如通過協方差計算相似度,一些簡單的協同過濾演算法如Item-CF或User-CF,自己學會去分析其性能和結果好壞等等。然後這一類演算法才能成為你的工具。


我覺得你欠缺的不是數學,也不是算導上的那些理論,而是現在就行動的決心。就算是學數學和演算法,如果用不上很快就會忘掉,然而工作中真正能用到演算法的人並不多,所以......我們需要做題,讓學到的,想到的,推導出來的知識可以鞏固,慢慢變成一種思考習慣。所以來這裡做題吧!

編程挑戰 問題

已經幫你排序了,從簡單的開始,不必全做,挑自己會的,或者感興趣的。當你能夠搞定一些80分的題目後,回去看算導,然後你會不自覺的讀下去,並且不想放下。


演算法分兩種:
1.《演算法導論》里那種,基本上就是面試中使用,刷題中使用,或者工作中根據需求學習其中幾個,再就是吹牛逼用,對於這種演算法的學習,贊同 @mu peng 的回答,即「急功近利」的學

2.演算法工程師(如:語音識別工程師、圖像識別工程師,搜索排序工程師,反作弊演算法工程師、廣告競價演算法工程師)工作中用到的演算法,會涉及大量的數學知識,比如《概率論》、《微積分》、《線性代數》、《資訊理論》、《中級統計》、《最優化》、《博弈論》等等,只有學好了數學,你才能進一步學習《機器學習》、《自然語言處理》、《數據挖掘》、《模式識別》等演算法工程師職業要求中提到的技術,如果你急功近利的學,用到哪個數學知識點才學哪個知識點,最後你學了很多知識點,但很難把知識點連成線,結果就是學了忘,忘了學,如此反覆,效率不高,對於這類演算法,你需要重新系統的學習數學


CS103: Mathematical Foundations of Computing
如果這門課的ppt你都能看懂,你就可以直接看演算法導論了,不需要更多學數學。


我不是演算法大拿,是做機器學習的在讀博士汪?即使我本科是數學系的,有時遇到具體數學問題也只有模糊印象?我的辦法是先維基百科嘍,然後按圖索驥學起來,一般可以解決問題的。簡言之,有想法了"馬上"編程試試;遇到數學不會"馬上"把那小塊學起來?這樣很有效率噠!寓言小馬過河不就是這麼講的(^?^)


非常想去,就去追尋,不要用別人的想法固化你的激情。
我也是一個程序員,但是每天下班我都會花時間研究物理,剛剛把E=mc2推導過程學會了,我知道沒用,但是我從小深愛物理。

如果沒有很明確放棄喜愛事物的理由,那就追尋自己的熱忱吧。


我看到題主說好幾次拿起《導論》,然後又放下

我覺得我似乎明白了些什麼

你起碼堅持把一件事先做到底吧


《演算法導論》,基本上中學數學就能搞定。而且這本書適合作為工具書來看。

學圖像處理的,要學好線性代數。不然大量的矩陣相關的東西搞不定。這裡推薦美帝 David.C.lay的《線性代數及其應用》

學模式識別/神經網路/機器學習的,除了線性代數,就是微積分,但是難度也不高。難搞定的是推導過程。概率論……好吧,我承認這玩意我玩不轉。

其實相比數學,更重要的是英文。因為國內大部分論文都是抄襲的。抄襲國外的演算法,圖都不捨得換一下,自己實現一遍,再說一些廢話湊頁數是國內論文的通用模式。所以真要專門搞演算法,勢必要接觸大量國外的論文原文。當初為了搞定shape context和TPS變換,我專門手動翻譯了這兩篇論文……的前半部分。國外的論文,那就是真論文。1 沒有廢話 2 圖是自己的 3 公式,推導過程,一步步寫得清清楚楚。學好英文才是key point。


反對排名第一的答案。

確實不能說演算法里用到一個數學工具,就得把這個方面的數學全都學了。比如說演算法里遇到一個代數幾何的定理,你肯定不能去真的學一下代數幾何。

但是,有很多數學基礎是演算法中非常常見的,離散數學,線性代數,概率論,微積分等。這些總是要遇到的數學,你遇到一個查一個肯定學的不系統不透徹,而且長遠的看,效率並不比扎紮實實打一遍數學基礎來的高。


想學開車,需要先學內燃機原理嗎?


搞數學的人大概會覺得,把數學和IT面試題扯到一起,簡直是對數學的侮辱。。。


數學是慢功夫,不是學一段時間立馬就能見效的,建議直接去oj刷題,刷到你不學數學就刷不動了為止。


反對高票答案
《演算法導論》這種有點難度的書,需要一定的數學和編程基礎才能看下去。
如果看起來很累很難很想睡覺,各種知識點查缺補漏,其實效果並不好。
遇到什麼學什麼,這種方法並不適合你現在水平,這種學習方法對有一定的數學和編程基礎的同學來講比較有效,因為他們基礎足夠寬,足夠牢,自然事半功倍。
你要問我,基礎需要達到什麼程度才行,985學校的計算機系成績前10%水平就差不多了
那麼重點來了,基礎不夠,如何學習呢?
1.把網易雲課堂的計算機4年的課重新學一遍,注意不是看一遍,是要學明白
2.把網易公開課的國際名校上面的數學和計算機的所有公開課看一遍
3.預計時間1-2年


一邊打著dota一邊想著學演算法,一邊看著電影一邊想著學數學,啊,人生好艱難啊,我該從哪裡開始呢?


所有的演算法都在於計算出結果的同時優化程序的時間複雜度與空間複雜度,跟數學關係都不是很大。


想干就干


演算法導論雖然很好,但也僅僅是導論而已。你那種意義上演算法學的好不好和數學好不好沒有太大關係。如果僅僅以找工作為目的,去topcoder上刷刷題完全可以。

如果你的目的是讀博,數學是必須要學的。不是曲線救國,而是必須。建議從rudin的分析開始一步一步學,大概我覺得學到代數拓撲,隨機過程就足夠了。也就是應用數學系本科學什麼重新學一遍總是沒有錯的。


單指演算法導論的沒必要,算導中只有數論演算法那一章用的數學比較多。如果是要學機器學習、密碼學等方向的話,個人認為還是重新學一遍對應的數學知識為好。


演算法導論沒那麼難


演算法導論用不到太多數學…證明直接看兩眼就行

倒是計算機視覺,計算機圖形,自動控制這些領域數學多。


其實很多現代語言都已經內置了效率很高的演算法.

比如C#的數組, 你再怎麼折騰(用C#本身的語句)排序演算法, 都及不上它內置的演算法.

所以用那些"高級"語言折騰演算法都是沒有必要的事. 你知道個大概就好, 把心思放在業務流程上就好.

如果你用的是那些比較"原始"的開發工具, 那麼可能就要花點心思在數學(演算法和一般的數學還有點差異)上面了.


推薦閱讀:

只用你的十隻手指,你能表達多少數字?
SVM 處理大規模數據有什麼好處?
遊戲里遇到過最牛逼的 AI 是什麼?
為什麼最難不過二叉樹的演算法出現在面試題中都會被應聘者抱怨?
機器學習中,有沒有給定的閾值返回聚類結果的演算法?

TAG:演算法 |