我正在學習算法,好像我正在學習彈吉他 - 重複後的重複。
然後你沒有學習算法。你正在學習重複。兩件不同的事情。算法書籍使用編程語言是次要因素。它只是一個指令的載體,一個實現細節。
什麼,你應該重點是理解的結構,邏輯和算法的數學特性(也可能是與它相關的數據結構(一個或多個)。)
這是你的重點應該是什麼。
但這樣做我覺得我更加迷戀,我將只能 在Java中實現這些。
但是,這是因爲您正在關注算法是如何被編碼的(在這種情況下,在Java中)。您正在關注實現細節。
當你學會駕駛時,你不會專注於如何學習駕駛本田思域或日產千里馬。你學習駕駛的本質,經驗法則,必要的預防措施和駕駛車輛的法律。
與學習算法相同。您不會學習「Java中的算法」,只不過是「Haskell中的算法」。你首先學習算法,最重要的是,車輛(非常特殊的情況)是次要的。
你應該專注於什麼算法確實,如何和爲什麼。像這樣的問題「它是如何工作的?」,最重要的是*「性能特點是什麼?」,那些是你應該關注的東西。每個優秀的算法書(包括Sedgewick's)都帶有這個信息。這就是你應該關注的。你如何進行重新聚焦,這是個人學習策略的一個功能。
如果您正在使用的書是語言特定的,您究竟會如何學習算法?
不關注語言。關注結構,關注所涉及的數據結構,不變量,前置條件和後置條件。瞭解Big-O(或Big-Omicron),Little-O/Little-Omicron和Omega符號中描述的漸近行爲。
您正在學習算法,而不是通過編碼算法在Java中進行編程。
如果你不能做這個心理跳躍,那就意味着你沒有足夠的練習或抽象分析。這不是一種侮辱,而是一種觀察和建議。編碼中,編程語言的使用通常是對計算機的數學分析(計算機科學的焦點(算法是其一部分))的次要。)
注意我做的Java超過10年,雖然我喜歡它工作,我堅信它是學習編程或CS其中一種不好的工具。
通過學習算法可以更好地服務於:A)程序化的,系統級的編程語言,如C或Ada,或者高級僞彙編器模擬器,或B)Lisp或Haskell等函數式語言。
純粹/僞純OO語言中面向對象的功能只是阻礙。
算法是一種數學結構,具有描述(操作)和/或什麼(數學)的性質。前者非常適合程序編程,後者則適用於函數式編程。
我會用本書使用的任何語言寫它們。然後,我可能會把它們寫在別的東西上。或相反亦然。 –
除非你打算在不久的將來編寫一些Haskell或Perl,否則我不會擔心。大多數編程語言沒有那麼不同,大多數都共享一個基本的通用功能集(儘管語法和世界觀傾向於改變)。一旦你有了經驗,你就可以選擇像lint這樣的新語言。現在關注算法中的實際概念,而不是用什麼語言來編寫它們。 – Miguel
直到6月25日纔可以使用,但是您可能會發現[算法的這個Udacity課程](http://www.udacity.com/overview/Course/cs215)被證明是有用的。 – Moses