我一直認為對一種演算法的理解有很多種層次境界:
1.知道有這麼乙個演算法,是解決什麼問題,輸入輸出是什麼。
2. 學會這種演算法的工作原理,每一步是怎麼做的怎麼推導出來的,從而可以做到程式設計實現該演算法。
3. 做到2其實還是不夠的,乙個演算法你算不算基本吃透它還要看,也就是你對它的應用場景的理解。
在知道其演算法原理的基礎上,能夠靈活應用該演算法,可以對該演算法在具體乙個應用中,可能出現的結果做到**分析,分析它每一步作了哪些工作,最後得到怎樣的效果。(這裡的分析是在具體結果出來之前你就能分析斷定出來的)。
4. 學海無涯,演算法可能還有另外的解釋更深刻的原理,不斷加深對演算法的理解。
對上面的境界的理解,我判斷自己是否能達到第3境界乃至第4境界乙個最簡單的方法就是,你用這個演算法進行某個以前未進行過的實踐。
如果實踐應用是該演算法的正常應用範圍, 你肯定能在結果出來前,做到分析**的。
而實際過程中會出現各種壞情形,糟糕的輸入,不正常的應用範圍。 這時候,你能不能做到對最終結果的**分析,最終壞情形出現的原因,中間經過的過程你能不能了然於心。
簡而言之,你知道演算法可以hold住哪些情形, 而各種情形下會出現哪些各種問題,你都了然於心!
可能是由於是數學系學生的緣故吧,我一直對自己的要求就是這樣,在條件允許的情況下,學會的每種演算法,都要做到第3境界,將一切掌控在自己手中。
也是因此,我對一些不能做到以上幾點的演算法從心底裡有種排斥感,雖然不影響我使用它,但畢竟我無法掌控它,以後出問題了怎麼辦? 比如現在比較火的深度學習。曾經深度學習還沒現在這麼火的時候,我就接觸這種演算法了,但自從我稍微對它進行學習後,我發現,這一類演算法由於沒有所謂的理論保證,也就是其基礎還不夠紮實。這種演算法就像是乙個黑箱子,你對其網路內部的實質完全不清楚,最終結果的好壞都是你用了才知道。。。最壞的一點還要各種調節引數,很多時候好的結果竟然還要一步步試出來。。。問別人你的結果為什麼這麼好,很多人的回答都是 「」我不知道,我試引數試出來的。。。「 你通過試引數試出來後結果好,然後呢,你覺得這部分工作理論上有多大貢獻?
所以對於那些搞深度學習的,我一直認為都是做具體應用的。 我更佩服的是那些可能有的少數 搞深度學習理論研究的大師!
現在深度學習大熱,連學術界好多人都在弄深度學習,這樣做真的對學術有什麼意義嗎!也許現階段會有很多令人驚嘆的成果,但這些成果有多少能被後人繼承並繼續發展出更好的理論? 理論研究的進展很可能對因此減緩許多!
A 演算法理解
廣度優先 bfs 和深度優先 dfs 搜尋 深度優先搜尋,用俗話說就是不見棺材不回頭。演算法會朝乙個方向進發,直到遇到邊界或者障礙物,才回溯。一般在實現的時候,我們採用遞迴的方式來進行,也可以採用模擬壓棧的方式來實現。如下圖,s代表起點,e代表終點。我們如果按照右 下 左 上這樣的擴充套件順序的話,...
dijkstra 演算法理解
求有向圖中乙個源點到其他頂點的最短距離 自己的理解 剛開始的時候相當於有三個集合 v 頂點集合 s 已求得的最短距離頂點集合,假設求a到其他頂點的最短距離 s 剩餘頂點集合 d 儲存的是最短距離值 求一維陣列中的最小值的下標,這個陣列不包含已經求得的頂點 找出最小值下標後,放入到s中,然後求剩餘頂點...
KM演算法理解
二分圖帶權匹配與最佳匹配 什麼是二分圖的帶權匹配?二分圖的帶權匹配就是求出乙個匹配集合,使得集合中邊的權值之和最大或最小。而二分圖的最佳匹配則一定為完備匹配,在此基礎上,才要求匹配的邊權值之和最大或最小。二分圖的帶權匹配與最佳匹配不等價,也不互相包含。我們可以使用km演算法實現求二分圖的最佳匹配。方...