1

「爲給定應用程序設計正確的算法是一項困難的工作,它需要一個主要的創造性行爲,解決問題並將解決方案從以太網中解脫出來,這比接受某人更困難其他人的想法,並修改或調整它,使其更好一點。在算法設計中你可以做出的選擇空間是巨大的,足以讓你有足夠的自由來吊死自己。深入理解算法設計技巧

我研究過像分治,動態規劃,貪心算法幾個基本的設計手法,回溯等

但我始終沒有認識到什麼樣的原則,當我遇到某些編程問題適用。我想要掌握算法的設計。

所以任何一個可以建議深入瞭解算法設計的原則,一個最好的地方.....

回答

0

約算法設計一本好書Kleinbeg Tardos。每一種設計技巧都取決於你要解決的問題。在算法書中進行練習非常重要,並且要有老師的反饋。

如果存在局部最優選擇並帶來全局最優解,則可以使用貪婪算法。

如果問題具有最佳子結構,則可以使用動態編程。

1

我建議Jon Bentley編程珍珠,第2版。他談了很多關於算法設計技術的知識,並提供了真實世界問題的例子,它們是如何解決的,以及不同算法如何影響運行時。

在整本書中,您將學習算法設計技巧,程序驗證方法以確保您的算法是正確的,並且您還將學習一些關於數據結構的知識。這本書非常好,我推薦給想要掌握算法的人。去閱讀亞馬遜評論:http://www.amazon.com/Programming-Pearls-2nd-Edition-Bentley/dp/0201657880

你可以看看一些書的內容在這裏:http://netlib.bell-labs.com/cm/cs/pearls/

享受!

1

你無法從閱讀書籍中學習算法設計。當然,書可以幫助。像這樣的書籍在另一個答案中建議使用珍珠編碼非常棒,因爲它們會給你帶來問題。每個問題都會促使您思考如何解決特定類型的問題。

這個想法是,你暴露在許多不同類型的問題和他們的解決方案。在此過程中,您將學習如何檢查問題並查看它是否與您已經看到的問題有共同之處。在這方面,這與你在數學課上如何解決「單詞問題」的方式並沒有太大的不同。當然,大多數算法問題比需要弄清楚兩列火車相撞的軌道更復雜,但你學習如何解決問題的方式是一樣的。你學習用於解決簡單問題的常用技術,然後結合這些技術來解決更復雜的問題等。

閱讀,練習,起泡,沖洗,重複。

除了像編程珍珠這樣的書籍,還有網站在線發佈不同的編程挑戰,您可以測試自己。如果你有朋友或同事對算法感興趣,它會有所幫助,因爲你可以互相提出想法並提出有趣的挑戰,或共同努力提出問題的解決方案。

我提到它需要練習嗎?

「掌握」任何東西都需要時間。很長時間。一個流行的理論是,需要10000小時的練習成爲任何事情的專家。對於特定的努力存在一些爭議,但總的來說這是事實。你一夜之間不會掌握任何東西。你必須學習。和練習。並閱讀其他人做了什麼。多學習一些,再練習一些。