讀一些博客之後冒出的想法

從問題出發

看到整個算法的誕生過程背後的思想

算法只是結局而已,而思考過程纔是情節。

1.本源問題是什麼
2.有哪些錯誤的思考過程
3.最終的結論是如何“高亮”的

我們平時學習算法時幾乎僅止於“理解”,別人把一個方案放在你面前,你去驗證一下,心說“哦,不錯,這個的確可以工作”。然後就沒了。稍微簡單一點的算法還好,複雜一點的對於記憶的負擔是很大的,這就是爲什麼有時候我們看到一個絕妙的解法,這個解法看上去不知道從哪裏來的,但經過我們的理解,卻發現是對的,我們感嘆,真巧妙,結果一些天之後,別人問起這個問題,我們說:“唉,那是個多麼巧妙的算法啊,但是我只記得它巧妙,卻不記得它到底是怎樣的了。” 爲什麼?因爲在不知其所以然的情況下,算法只是一堆離散的機械步驟,缺少背後的思想的支撐,這些步驟之間就沒有一個本質層面上的關聯(先知亞里士多德早就指出:學習即聯接)。所以就跟背歷史書也沒多大區別。然而,知道了算法是怎樣一步步被推導出來的,我們就一下擁有了大量的記憶提取線索:對算法發現過程中的任何一個關鍵步驟(尤其是本質)的回憶都可能使我們能夠自己動手推導出剩餘的內容。
譬如你知道堆(heap)是怎樣由樸素的決策樹演化而來的,它又是爲了解決什麼問題的,你即便忘記了具體的細節,也可以自己推導出來。譬如你知道KMP算法的本質在於消除回溯,至於如何消除回溯卻並不是那麼難以推導的,所以即便忘了也可以藉助於大腦的邏輯演繹能力再現出來。譬如你知道Tarjan算法其實只是從後序遍歷經過兩個優化調整而來的(其中並査集的使用其實只是優化手段——爲了能夠迅速判斷祖先節點是誰——而非算法本質——當然,算法設計的主要任務本來就是通過問題條件中蘊含的知識來“消除冗餘計算”和“避免不必要計算”,所以你也可以說並査集的使用是關乎本質的,只不過,知道了爲什麼需要引入並査集,就會強烈地感覺到一切是順理成章的了),那這個出了名的繞人的算法也就不那麼難以理解和記憶了。

【根本問題 原子問題在哪】

記一個算法,就只有一個算法。一個蘿蔔一個坑。就好比背99乘法表只能解決乘法問題一樣。
而記背後的思想,卻有助於解決一類問題。思想所處的抽象層面往往比到處都是實現細節的算法本身要低,越是低的抽象層次,越是本質,涵蓋範圍越是廣泛。
數學的發展本身就體現了這個過程,抽象代數就是非常好的例子。算法誕生過程中的思路往往包含了比實際算法更本質得多的知識,實際算法乃至算法的某個特定語言的實現包含了太多表面的不相干知識,它們會阻礙對本質的理解。

【算法不是解決問題,而是解決一類問題,不是求一個問題的解而是求這一類問題通解】

找到這類問題的根本在哪

是博弈問題 還是最優化問題
涉及概率 微積分 那些。

再逆向加上難度,這就是一個本源的過程式的思考和解決過程。

降維到壓縮爲一個點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章