有沒有人怎麼都學不會演算法?
因為看知乎的感覺就是什麼東西你不會那一定就是你沒努力,但是會不會有努力學了依舊學不會演算法呢?就是很努力依舊沒辦法活學活用?我最近在看演算法的書,看的很費勁,就有此疑問。。。
沒有。
但是學習方法很重要。你讓一個聯賽普及組水平的人,去學後綴自動機,肯定怎麼都學不會。這個時候可以選擇先放下,然後去學些符合自己情況的,或許若干年後再來看就能學會了。(至今為止後綴自動機怎麼都學不會的答主飄過)
很多時候怎麼都學不會是一個錯覺。你在放假的時候學著學著點開了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自動機?
推薦閱讀:
※有沒有什麼操作方便的非圖形操作系統?
※公司沒有大牛好不好?
※為什麼有人天生對編程有天賦?
※做遊戲的人如何玩遊戲?
※為什麼有程序員都說取的隨機數是偽隨機數?