如何將數據結構和算法應用到實際之中?

著做權歸做者全部。
商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
做者:invalid s
連接:http://www.zhihu.com/question/20066988/answer/26968999
來源:知乎

通常來講,數據結構和算法這本書上提到的任何算法/數據結構,你都不會有機會從新實現一次。 由於,早有就各類各樣的庫,對外提供了工業級的、充分泛化的實現,只需拿來用就是了。 重寫的話,一個代碼質量/執行速度,顯然都極難超過通過千錘百煉的、在無數項目中通過充分測試的庫實現;另外一個,書上都是爲了教學而作的簡化實現,實際使用中,須要對算法作必定的泛化。(好比,c的qsort庫函數,只要保證數據是以指針數組索引的、對自定義數據須傳入比較大小的功能函數,那麼任何數據均可以用這個qsort算法排序;C++裏面呢,則是和容器、迭代器之類東西結合通盤考慮的,可泛用於任何符合規範的容器和原生數據類型。而課本上的實現,僅能支持數組中的整數。想作到工業水平,沒有足夠的經驗是不可能的。) 但,另外一方面,全部這些算法/數據結構的設計思路,卻會貫穿於絕大部分項目之中。 好比說,簡單的冒泡算法,它是否是隻是「屢次掃描一個數組,交換遇到的每一對相鄰的、順序反了的數字;當再也不發生交換時,數組已完成排序」甚至」好不容易纔死記硬背下來的一段代碼「? 若是你只學會了這個,那麼,你真就徹底白學了。 做爲一個表現通常的排序算法,冒泡排序自己出場率就不高;況且還有各類提供了泛化的sort算法的庫:若是僅僅記下了這個,那麼你一生都不會遇到」必須重寫冒泡算法「的場合。 但,若是你把冒泡算法記成: 就好象水中的氣泡同樣,每次只執行「相鄰的元素比較密度(或其它特徵),密度小的上浮,密度大的下沉」這個局部物理過程;屢次進行後,局部有序就會變成(相關特徵上的)總體有序。 甚至: 模仿各類會致使總體有序現象的局部過程去處理數據,可使得數據總體上知足相似的排布。 甚至: 考察任何天然規律,看它會產生什麼有趣的後果;那麼當須要達到相似的效果時,不妨嘗試用程序模擬出這個規律,極可能就已經獲得了想要的效果。 那,你這一輩子,可就受用不盡了。 好比說,」高大上「的」神經網絡「」遺傳算法「」蟻羣算法「等等等等,其實骨子裏不都是這個」冒泡思路「嗎? 相似的,各類樹都是鏈表的」鉤掛「思想+數組的」索引「思想的結合體;」模擬退火算法「又是冒泡思路結出來的另外一顆果子;音頻濾波算法就是簡諧振動計算公式;面向對象的」繼承「不過是常見的」歸一化「手法的另外一個表述方式…… 能夠說,若是能像對冒泡算法的真正理解同樣,完全弄明白各類算法的設計思路並加以借鑑,那麼你對這個世界的各類規律瞭解的有多透徹,你的程序就能夠寫的有多靈動。 一旦掌握這個,今後,你再沒必要像那些菜鳥同樣,絞盡腦汁敲出無數代碼去」湊「需求;而是隻需用代碼編織出須要的規律,而後丟給CPU執行,你真正想要的東西就會天然」涌現「:如今,你只要找出」結果已經出現「的識別方法,用它來結束你的邏輯就好了。 (固然,達成一個目的每每能夠有多個不一樣的途徑,不一樣途徑利用不一樣的規律;那麼哪一個途徑最優呢?算法課教過你:這就是所謂的「算法複雜度」) ——冒泡算法可不就是用代碼編織了一個」數值大者靠前(或靠後)「的規律,而後丟給CPU一跑,一大片數據就有序了? ——遺傳算法呢,不正是」抄襲「了天然界的天然選擇規律嗎?把這個規律丟給CPU一跑,竟然連AI都弄出來了! 這些只是一些特別經典、特別著名的案例而已。 實際工做中,也是時刻均可能遇到一些新鮮的需求/場景;要完成工做,除了出苦力一行行碼代碼外,同樣能夠經過觀察找到其中的規律,而後用代碼編織規律,再讓這些規律去替你完成需求:後者每每會比前者簡潔的多得多,執行速度通常也會快得多得多。 這類隨時隨地「發明」的算法實在不值一提,不能讓你像那些著名案例同樣一鳴驚人;但它們卻實實在在能夠提升你的工做效率,讓其餘人可望不可即。 ——常常有高手驕傲的宣稱,別人幾萬、幾十萬行代碼都解決不了的問題,他數百行代碼就清楚漂亮的解決了,執行效率還高出許多倍:他們就是這樣作到的。
相關文章
相關標籤/搜索