-
1 # 巨俠說
-
2 # 跟黃哥學程式設計
先找一本或買一本資料結構與演算法的書,選擇自己熟悉的程式語言描述的書。
採用二遍學習方法,第一遍粗讀,第二遍精度,書上程式碼都需要敲一遍。
再去刷LeetCode
相關書和影片,請看下面的連結
https://www.toutiao.com/i6846532660500627976/
-
3 # 教女朋友學程式設計
作為資深程式設計師,發表下自己的觀點!
1.資料結構,必學,並且要學的很深入
2.高等數學,撿起來,再好好學!
-
4 # 胖子隨感
把自己變笨,要進入計算機的世界,每次只能進行一步計算。最難的演算法都是需要迭代理解,比如連結串列逆轉,如果空間足夠大,可以把所有鏈條斷開並且都儲存起來,用遞迴:頭部的指標直接給臨時指標,臨時指標變頭部指標繼續迴圈,直到找到尾部的指標,然後頭尾交換,完成轉換。
public Node reverseList(Node node) {
if(node.next == null) {//當最後一個節點的時候返回return node;
}
Node temp = node.next;//得到當前節點的下一個節點
Node returnNode = reverseList(temp);
temp.next = node;//下一個節點的下一個節點為當前節點實現逆轉
node.next = null;//實現逆轉前連結串列的頭結點為為節點
return returnNode;//返回逆轉後的連結串列的頭節點
}
如果沒有大空間,就需要頭指標自己迭代,儲存頭部的指標,頭部的指標變頭頭部指標(第一次為尾部空),頭頭部指標變頭指標,頭指標變頭部指標,這一輪結束,下輪開始,直到末尾。
public Node reverseList2(Node node) {
Node frontNode = null;//頭結點逆轉的時候前一個節點為null
Node headNode = node;//當前節點為頭節點
Node tempNode;//臨時變數儲存下一個節點while(headNode != null) {
tempNode = headNode.next;
headNode.next = frontNode;//實現逆轉
frontNode = headNode;
headNode = tempNode;
}
return frontNode;
}
-
5 # 枝枝葉葉
我的經驗,動態演示網站,看每種演算法執行過程的動態過程,比純粹看書,理解的快的多,先搞清楚設計算法的目的,運處,看了動態演示 以後,再透過文字敘述和程式 理解演算法的實現細節。另外 普林斯頓大學 cos 226 課程 的線上 ppt ,也寫的非常好,內容豐富,可以幫助和加深理解。比如他在說明演算法漸進複雜度時,說了一個,1000個數,計算所有三個數組合和等於0的個數的例子,這個一般教材沒有,促使人思考。某些教程 作者 自己也 沒有理解到位,把簡單的事情,敘述的難懂了
-
6 # 胖豬蹄
如果你想從頭學,可以先找一本入門書籍看看,這個是最快的方法讓你進入演算法的大門,推薦《資料結構與演算法圖解》,這本書賊雞兒給力,通俗易懂。
入門後,就是在不同業務場景應用演算法,這個根據個人的工作內容,另一個就是letcode,反正這種題刷刷沒壞處,還可以讓自己覺得自己又變聰明瞭,哈哈!
-
7 # 楊小楊影視
在網路上流行一句話:演算法分三種,競賽的演算法、面試的演算法、演算法。雖然這麼分非常讓人無語,但其實可以去這麼理解,因為競賽、面試和純理論的要求和限制是不同的,所以演算法在不同的要求中展現了不同的樣子。
對於競賽來說,每道題對輸入引數和樣本量的要求都是非常明確的,同時規定的非常明確的還有空間的限制和執行時間的限制。每一個競賽選手都非常熟練怎麼根據這些提前給好的限制,反推出自己需要實現一個什麼樣複雜度的解法才能透過。每一行程式碼包含著前輩和自己思考過的最佳化。
而對於面試來說,限制往往並不明確,造成這個現象的原因也很好理解。競賽中當然是分數最重要。在面試的過程中,與面試官的交流和體現自己想事情的方式、體現自己邏輯的嚴密更重要。所以同一道題,在競賽中必須寫清楚限制,而在面試中一道題剛開始的限制沒那麼多,目的就是縮短你理解題目的時間,讓面試者先寫出一點什麼,然後和麵試官展開討論,隨著討論的深入,再逐漸的把限制聊清楚。總之在面試的場合就是想看看你想問題的習慣、軌跡以及表達能力是否符合要求。
當然,不管是什麼要求下的演算法,經常練習演算法和資料結構題目對一個人在邏輯上的提升都是顯而易見的,在學校參加ACM並取得很好成績的同學,如果不是表達能力特別差的話,是一定會收穫很多offer的,因為思維被鍛鍊的很好。
對於演算法,給大家的建議:
先找到線團,然後進入線團裡學著怎麼玩。為了進入線團,需要先把基礎知識掌握好。《演算法和資料結構》(教材),你一定要看完+理解。這裡面講的都是不能再基礎的東西了,覺得講得不好,自己搜維基百科。沒辦法,如果堅持不下來,後面就受罪去吧。
對於線上刷題平臺的題目,先不找解答,先自己實現,實現的多low,複雜度多差,都堅持寫完。
然後分析出複雜度。接下來去網上找答案,看到複雜度和你一樣或比你低的,直接略過。看到比你好的,重點看,一定要理解,然後分析為什麼比你的好,如果你真的理解了,你一定能找到別人最佳化的點。
這個過程可能是最奇妙的過程,不要給自己太大壓力,這個過程其實可以很歡樂,有想法並創造出來,練習了自己的coding能力。
別人有更好的實現,推翻了你的所有模型和幻想,你幻滅了,卻也因此找到了讓你血脈噴張方法。這個階段看似苦,實際上其樂無窮。
在學習別人解法的過程中,又瞭解了很多演算法和資料結構。而且付出的每一滴汗水,都是結果導向的,可量化的,實實在在的。
寫寫簡單的測試函式就可以發現自己方法的執行時間和更好的解法就是沒法比。這是一個非常培養自驅力的階段,這是一個只追求解法更快更強的階段。
看到很多經典的結構,學到很多很不錯的最佳化。比讀那些讓你吃力的書更加快樂,也能夠一直啟發你走下去。你苦苦尋找啊,覺得好的不能再好的方法啊,直到有一天,突然看到一個更優的解法,相信你一定會一整天都在賢者時間裡。
不建議剛開始刷題的人就直接在網路上搜集文章開始學習,因為太散了,而且需要花很多時間去鑑別正確與否。
把底子打好之後,對於專項演算法的學習就得心應手了,而且會學的很快。 對於很龐大的演算法,找例子來引導自己的思路,一點一點的接近演算法的核心。唯一需要注意的是,一定要寫程式碼,光看沒有用的。
對於經典演算法的學習,大體上分成幾個階段:
第一階段:對於某一個具體的演算法,首先要搞清楚這個演算法解決的問題是什麼,可能是實現一個具體的功能,也可能是在某些方面,比如時間複雜度或者空間複雜度方面很卓越,總之搞清楚這個演算法被研究出來的目的是什麼。第二階段:然後就要弄清楚這個演算法的生存環境了,也就是看看你此時研究的東西是不是對別的知識有依賴,應該先把底層依賴的知識理解並掌握。這些問題都解決之後,就進入到演算法本身的學習,理解一個演算法是一件辛苦的事情,剛開始看必然會產生很多的困惑,比如經常會懷疑作者講述的內容的重要性?這些內容和這個演算法有什麼聯絡呢?經常會有這種摸不著頭腦的感覺,其實作者做的鋪墊都是為了建立起描述演算法主要內容的基礎,只有接受和理解這些基礎,才能逐漸觸碰到演算法的精髓,所以耐心是很重要的。第三階段:演算法的主要過程看完之後,往往還是會感到困惑,主要是不知道這個過程好在哪,這就進入了下一個階段,理解作者對這個過程在功能性或者效率卓越這件事上的解釋和證明。這才真正觸碰到演算法最精髓的部分,也就是深度的理解演算法的主要過程所帶來的好處,這才是最鍛鍊人理解能力的地方。第四階段:上面幾點是演算法學習階段的過程了,接下來就是研究演算法的程式碼實現,自己設計測試用例親自跑一下程式碼,以及從程式碼執行時間的角度分析這個演算法的優勢,這也是加深對演算法的理解的過程。第五階段:最後是配合相應的題目練習,讓自己透過題目練習的方式,會用、善用學習到的演算法,並對這個演算法產生一定的敏感程度,具體是指看到某些題目時,能夠根據題目的特點,產生與該演算法的對應,也就是具備舉一反三的能力。學習永無止境,不管是演算法小白,還是有一定的演算法基礎,提升演算法永遠都是剛需。
回覆列表
從學習安排上,可以以如下的學習路線做準備:
一、數學能力基礎
無論是否計算機出身,數學方面的能力在演算法工作中是非常必要的基礎,需要掌握的程度如下:
1、高等數學,主要包括微分和積分、偏微分、向量值函式、方向梯度、泰勒展開等,才能更好理解演算法公式,調參原理,以及迭代時梯度的概念等;
2、線性代數,主要是矩陣運算、高維向量、空間運算,這些是理解深度學習向量空間的基礎;
3、機率論及數理統計,或者稱之為機率學和統計學,要理解,機器學習本質上是一個機率問題,從資料中學習的不確定性,就是在獲得機率值。
二、計算機科學能力基礎
演算法工程師是一個研發性崗位,寫程式碼的能力也是必須的。
1、掌握基本的排序、查詢演算法
2、熟悉常用的各類資料結構,如陣列、樹、表
3、將抽象邏輯思路轉為程式碼,能完成leetcode上中等難度的題目
4、有程式語言學習能力,會python更好,其他語言需要花時間瞭解其語法特點
以上兩大基礎,如果是工科出身,應該不會需要太久做準備,可以根據缺少的部分來查漏補缺,這些部分在兩個月內完成應該問題不大。
後續才是真的開始做演算法的學習:
三、機器學習演算法能力基礎
1、熟悉常用機器學習演算法的原理,包括線性迴歸、邏輯迴歸、決策樹、K均值、SVM、adaboost、CNN、RNN等
2、能夠了解各個演算法的優劣和適用的資料場景
3、熟悉常用機器學習演算法在程式碼中的實現,深一些是能自己手寫實現,淺一些是能透過使用python的包來呼叫,熟悉引數
4、能夠獨立完成完整的資料專案,如在kaggle上嘗試解決入門的問題,實現從資料處理到模型選擇直到輸出結果的過程
第三部分是個長久的事情,不斷的熟悉演算法和使用,並在實際資料專案中來深化,不去公司實習的話,在kaggle上多做嘗試可以積累不少經驗。
當能掌握這些後,就可算做正式入門了,目前大廠的實習生或者校招生基本就在這個水平程度,想要得到更好的機會或者能在工作中真的有好的產出,需要更多的努力和學習。