有沒有人怎麼都學不會演算法?

因為看知乎的感覺就是什麼東西你不會那一定就是你沒努力,但是會不會有努力學了依舊學不會演算法呢?就是很努力依舊沒辦法活學活用?我最近在看演算法的書,看的很費勁,就有此疑問。。。


沒有。

但是學習方法很重要。

你讓一個聯賽普及組水平的人,去學後綴自動機,肯定怎麼都學不會

這個時候可以選擇先放下,然後去學些符合自己情況的,或許若干年後再來看就能學會了。

至今為止後綴自動機怎麼都學不會的答主飄過

很多時候怎麼都學不會是一個錯覺。

你在放假的時候學著學著點開了bilibili,你在還沒學過Splay的時候去學動態仙人掌,你讓沒有接觸過歐拉函數更沒接觸過莫比烏斯函數的人去看JZPKIL的題解,你昨天剛剛熬夜今天早上爬起來啃論文,你拿著一個滿紙學術用語高大上的讓你望而生畏的課件……各種各樣的因素很容易讓人棄療覺得自己怎麼都學不會。

我應該是智商比較低的那種人,線段樹的lazy-tag要想幾天,學Splay又要想幾天,學過可持久化線段樹又要想幾天,當時覺得怎麼都學不會,非常羨慕機房裡一看就懂的同學。

可是回過頭來看,這些東西其實真的很沒有那麼難,靜下心來慢慢學總能學懂,FFT如是,KMP如是。

最後說說學習方法。

算是為自己學這些簡單數據結構學得這麼吃力找借口。

學習新知識的時候,首先要找一個好的資料,保持清晰的頭腦,然後開始逐字閱讀……

然後一定要隨時提醒自己:不要發獃,不要發獃,不要發獃!!!

事實上我覺得學習新演算法,最容易遇到的就是發獃……由於對這個演算法的定義、思想、原理等等非常陌生,不能和以前學過的進行類比,所以很難進入思考的狀態,然後就變成了單純的在默讀論文,然後一天就過去了。


恕我直言,一個NOIP提高組的人,只要想學,一樣可以學會後綴自動機。

而我現在每次回想,都覺得這實在是一個NOIP提高組數據結構,只要找到合適的資料,學會並不是難事。

其實大部分基本演算法都是很容易理解的,短則一個小時長則幾天就能看懂。

只要專專心心的看,都不是難事。

難的是人心變了,不敢像以前一樣以純粹的好奇之心面對這些新演算法了。


答主最近看演算法有所突破,冒昧來分享下心得。(之前也是各種自我否定懷疑負能量)

答主初學者,認為學習演算法以下幾件事情不要做:

1. 不要一開始就看演算法導論。答主初級水平,真在這本書上浪費了寶貴的青春和無謂的自卑。後來轉看 The Algorithms(Bobert Sedgewick,Kevin ,圖解非常多,循環遞歸的規則都會畫出來,很幫助理解;

2. 不要光看不練習。看得懂和能寫真的還差十幾個小時的苦工,尤其是圖演算法。比如最短路徑,不寫是不知道裡面需要 indexed priority queue,而這個數據結構的複雜又是在 priority queue 之上。答主當時真的不能理解 indexed 的意思,冥思苦想了好多天。後來還是畫圖,一步步的解析,才啃下來。

3. 看不懂也不要硬看。保持一個自信的心態,如果當時看不懂,那就去干別的或者看其他感興趣的演算法,不要懷疑自己的能力,而是想著自己對這個演算法沒那麼好奇呢,所以才看不下去。等到認知足夠多了,我意識到這個演算法的存在意義了,那我一定能看得懂的~總之保持一直持續學習樂觀的心態。

4. 不要想著能把演算法都看完了。演算法真的很多很多,其實越學才發現要學的更多。所以可以慢慢來,把演算法當做一個興趣,而不是一個任務去完成。

最後一句大家共勉:

紙上得來終覺淺,絕知此事要躬行。


作為一個編程學渣,我想說有……快排什麼的,演算法知道就是死活實現不出來。

或許是push不夠強吧(?_?)

要是「不會寫快排就掛科」這種設定存在的話我應該能寫出來

至於以kmp為基礎的字元串一系列神奇演算法什麼的,呵呵,理解都頭大還寫個毛啊(?_?)

別跟我提更神奇的幾乎永遠都用不到的演算法。那種東西考試前一天和考試兩小時內能啃下來就行了。如果不做科研,實際工作也就只要照著演算法敲一遍就行了。


別看演算法導論, 別看演算法導論, 別看演算法導論

以前演算法導論看2個月看了9章各種負能量,什麼都沒學會

現在看 演算法 ,紅皮的java版的,分分鐘用手寫鏈式和順序的棧和隊列,各種演算法

我承認我菜,但選擇適合你的更重要


你會寫Hello World吧?

這就是一個在屏幕上顯示Hello World的演算法啊

是不是有點自信了?

不過呢,每個人都有自己擅長的和不擅長的東西,不比強求。

有時候我也覺得,要是能有從小就能辨別思維優勢,不知道能少走多少彎路


我想起上學那會兒我老師給我講,他有次給個初中小朋友輔導物理,講到電流的時候畫了個電路圖。小朋友問:老師,這電線是直角的,那電流能走過去么?

我老師聽了以後有點懷疑人生了。

還有一回我在巴黎移民局辦手續,一個男辦事員在給女辦事員講「and」和「or」的區別,說了五分多鐘,聽到最後我都急了也加入了講解。最後的結果是女辦事員堅持認為"and"和"or"沒什麼區別,一副你們說你們的反正我蠢我無所謂的樣子。

所以有些事情有些人真心學不會,他腦迴路的拐彎是直角的啊。


謝邀

沒見過有人怎麼都學不會演算法。可能有吧。不是所有東西都是努力就一定能夠獲得的。不然就沒有緣木求魚這個詞了。

演算法不至於完全無法學。說說我的直觀感受吧,我開始工作的時候,我姐姐已經在一家國內ERP公司工作了5年了。我和她說我要做程序員了,但是我專業其實是自動化。她說 那要學好演算法和數據結構啊。我說好的,回去就看書。當然其實回去也沒看。

兩年後我也帶了6個人的團隊了。

譚浩強的C++也好 數據結構 代碼大全什麼的,我都沒看過。靠著 stackoverflow+github 就這麼過來了。至於演算法和數據結構,這個正經概念我是講不清楚的。但是說做個App結構,怎樣的場景用什麼模式解決。這些倒是都會。來說我一個硬傷吧,由於沒有受過正經的編程教育,很多詞是靠悟的,不是靠學的,我覺得這個可能和母語是漢語也有關係。漢語比較講究望文生義,你看 落霞與孤騖齊飛,秋水共長天一色 ,兩句話讀著漂亮,想像著也很美。那麼問題來了 演算法這個詞是個硬翻譯的詞 對著 algorithm.相對來講,英文都是音讀詞,每個詞都有相對來講都有獨特的意義。那麼 演算法是什麼 我們知道語法是語言的規則,那演算法是計算的規則么?類似乘法交換律一樣么?事實不是的,algorithm 的 字典定義是:a process or set of rules to be followed in calculations or other problem-solving operations, especially by a computer。直白的翻譯過來 algorithm 等於計算機解決問題進行計算的過程(或者遵循的規則)。簡單說 就是計算機解決問題或者執行計算的過程,這是啥?這是代碼本身啊!!!

這麼說吧 學演算法:真正的含義是,學習將現實邏輯抽象成數學模型,再用代碼表達的能力。

好的,開篇這個命名即沒有使得概念容易理解甚至還產生了誤導。那麼這個學習過程很困難我就一點都不奇怪了。

所以說學英文對學編程很重要。

但是都沒有實際操作重要。


有啊

動態規劃(DP)什麼怎麼學也學不會…

什麼背包dp 區間dp 單調dp 棋盤dp 環狀dp 序列dp 就是弄不懂啊…

------

演算法的本質還是數學,一個小學生學傅立葉 微積分肯定是不行的。

要一步一步來,從初等到高等。

------

可以用 CodeVS v2 全新的天梯入門哦,專門為初學者優化⊙▽⊙


這些答案都是看在提問者把自己姿態放低後,一副「我厲害,小朋友,沒有辣么難,雖然你怎麼學都學不過我,但是你還是可以超越凡人的」的姿態。

如果你換個問法「最近來了個同事,怎麼教他演算法都學不會,也下了不少功夫,為什麼不見長進?真有人怎麼學都學不會演算法嗎?」

我相信會炸出一堆聖母婊。


從初中開始學編程…現在都完整地寫不出動規和快排的路過…

然而並不影響我經常寫處理數據的程序 心理學實驗的程序etc


真的有。

但是請相信,不是努力就會有結果。但是不努力就永遠沒結果

多看幾遍吧,多重複敲幾遍吧,萬一有一天突然看懂了呢。


剛在學dp,怎麼學都不會……不過多看看,就不信花幾天時間都學不會 ……努力就行,每個人的情況不同,接受演算法的時間也不一樣,管他呢……看下去就行了,不懂,明天看幾遍,在不懂,後天再看,老子就不信了 題主加油!


看來覺得演算法難的不止我一個人。

想說的是,一定要堅持思考和練習

大一到大二 學習數據結構和演算法接近兩年 各種聽課看書看視頻在草稿紙上驗算模擬

很痛苦 真的是學不會

後來大四考研的時候 突然覺得演算法是幾門專業課裡面最簡單的 可能以前那段苦學的經歷多多少少打了一些基礎吧

再後來找工作的時候 還要去看演算法的東西 這時候發現原來演算法題目範圍很有限(個人覺得)可以總結出來的

所以加加埋學了有兩三年了吧 對我來說 真的是看了忘忘了看 雖然到現在還是覺得難 但已經沒有那麼難了 而且有些東西只要知道了原理 就很簡單了 忘了沒關係 上網查一查 記憶又能恢復 而且在不斷需要使用的時候 你一定會掌握透徹的 至少背都背下來了吧

數據結構演算法真是能提高我們智商和做事方法的一門課程。


我,高中文科,大學軟體工程,數學大一掛了一年,高中數學托後腿,什麼簡單堆棧,二叉樹還行,學操作系統蒙圈了……


有,不灌雞湯,人不是理想中時間無限的,你要賺錢,要娛樂,世界上誘惑那麼多,如果學了一年一點反饋都沒有誰又能堅持學下去呢?所以那些演算法學的好的是因為他們能得到反饋,能得到激勵才堅持下去的。


我就因此苦惱過,一直感覺是自己太笨了,

其實把,那些演算法看著還是懂,簡單的題也做的出來,但是稍微複雜一點的題目自己敲代碼了就感覺腦子空白了。敲代碼的時候就要專註很多細節,雖然知道應該要怎麼把問題分解為一步一步,但是就是在實現方法上覺得很困惑。

當然我也經常看不懂別人寫的代碼,所以我又會懷疑自己是不是太笨T-T

但是我還是不會放棄,我覺得堅持下去還是能達到一般程序員的標準。


咋叫學會啊?俺本人的問題是當時能理解、能寫出代碼,幾天之後就只能記個大概了。這算不算學會?

個人認為,能夠使用較優演算法解決實際問題了,就算學會了。而這正是演算法學習本身的困難所在。


首先,演算法與數學有關,但演算法不代表就是數學,演算法是解決一個問題的步驟,演算法沒有錯對之分(如果演算法得不到正確答案那麼這個根本不是解決問題的演算法),但演算法有效率高低之分,例如冒泡排序與快速排序的效率是不同的,一般來說效率低的演算法比較容易理解,效率高的演算法涉及很多技巧所以不容易理解,例如Floyd演算法的動態規劃,狀態轉換折磨我很長時間了還是不是很明白,但我死記公式,背包問題是一個二維狀態好理解,Floyd演算法是一個三維狀態轉換我確實理解不了了。窮舉是一個無所不能的演算法,但是效率太低,但起碼我會用窮舉這個萬能而笨拙的方法解決問題了,如果演算法難,那是因為你還不熟悉數據之間的關聯性,技巧的東西不會很容易的,否則人人都是計算機科學家了。


AK自動機?


推薦閱讀:

有沒有什麼操作方便的非圖形操作系統?
公司沒有大牛好不好?
為什麼有人天生對編程有天賦?
做遊戲的人如何玩遊戲?
為什麼有程序員都說取的隨機數是偽隨機數?

TAG:演算法 | 編程 | 計算機 | 清華大學 | ACM競賽 |