2012-06-14 43 views
8

所以夏天我決定,我可能也開始學習開學前的算法。有人告訴我,這門課速度相當快,算法不是你應該輕視的(我有傾向於在學期所有課程上都這麼做)。途徑學習算法使用特定語言

我們將使用這本書是這個Algorithms (4th Edition)。不管怎樣,這是我的問題。

我通過這本書幾乎是第三條道路,但我意識到我在做什麼。例如,我會閱讀並重新閱讀我不太瞭解的部分。然後,如果我感到足夠自信,我會嘗試從我的頭中再現java中的相同算法。但通過這樣做,我的代碼看起來幾乎完全像書中的..在Java中。

我不能說我只是記憶代碼代碼之後 - 我理解的概念,他們幫我這些代碼的算法 - 但我覺得我只能就能夠在Java中實現這些算法。我應該注意到,我目前只知道Java。

tldr:我在學習算法,如果我正在學習彈吉他 - 重複之後的重複。但是通過這樣做,我覺得我更加註意我只能在java中實現這些。如果您正在使用的書是特定語言的,您究竟會如何學習算法?

在此先感謝。

+0

我會用本書使用的任何語言寫它們。然後,我可能會把它們寫在別的東西上。或相反亦然。 –

+1

除非你打算在不久的將來編寫一些Haskell或Perl,否則我不會擔心。大多數編程語言沒有那麼不同,大多數都共享一個基本的通用功能集(儘管語法和世界觀傾向於改變)。一旦你有了經驗,你就可以選擇像lint這樣的新語言。現在關注算法中的實際概念,而不是用什麼語言來編寫它們。 – Miguel

+0

直到6月25日纔可以使用,但是您可能會發現[算法的這個Udacity課程](http://www.udacity.com/overview/Course/cs215)被證明是有用的。 – Moses

回答

9

不要把自己

你正在學習Java,所以他們在編寫Java。特別是如果Java是您的第一語言。不要混淆自己的現在,當你正在努力學習一次兩件事情:如何在Java中課程校,並如何課程校你正在學習新的語言和思維方式。不要做太多,但現在添加另一種語言的醬。

分散投資

後來,或者如果你有足夠的信心,你可以同時在另一種語言,那麼這顯然是有益的學習另外一個,並嘗試複製算法不看的書。

複製和擴展

我們可以給你推薦的是尋找的算法衍生物。已經記錄的已知變體,以及您可以在哪裏閱讀變體的描述,以便您可以嘗試從「基本」版本實現它,而無需閱讀該書。例如,如果您的書向您介紹了鏈接列表,則應該能夠爲雙向鏈接列表或循環鏈接列表提供算法,而不必讀取所需結果的更多描述。或者有一些關於你明顯誤解的原始概念。

先試,繼續讀下去,後來

我建議你居然連試圖實現在你的書中描述的算法,他們拿給你之前。看到Sedgewick的算法的目的是看到一個規範的實現,這被認爲是一個標準的藍圖。如果您只是閱讀實施過程中的一部分(希望先顯示該部分),那麼就坐下來閱讀本書,並試着弄清楚如何做到這一點。如果你完全無法做到這一點,那麼你的書就太遙遠了,應該重新開始並重新開始。

+0

謝謝,我真的很喜歡在看書中的例子之前嘗試實現的想法。 – user1164937

+0

@ user1164937:當我學習時,我們基本上從來沒有顯示出實現,我們只是一直在編碼,當被阻止時,我們會問助手(這將99%的時間來到,閱讀我們的代碼,笑,問什麼是錯誤的或我們不明白的,最後告訴我們「RTFM」,雖然這很嚴厲,但這是一個很好的方法。)我們唯一一次看到一個實施是當我們有一個小組講座,他們會投影他們編輯器在屏幕上直接輸入節目。記筆記不是禁止的,但建議不要。起初,書籍被皺起了眉頭。 – haylem

+0

@ user1164937:不用客氣,我很高興它能幫助你。如果你想得到你想要的地方,請在下面給我們留言:) – haylem

0

你不知道你對算法背後的數學有多瞭解。這將是確定你的設施與代碼的關鍵。

Sedgewick的書很好。我可以隨意挑選一些並查看其他書籍,例如「數字食譜」和「工作的數值方法」。看看另一個觀點能否爲你澄清。

如果你覺得自己沒有足夠的複製Java的能力,那麼看看你是否可以將它們翻譯成另一種語言,也許是Python或純粹的功能選擇。如果你能做到這一點,你就會知道你已經掌握了它。

0

我要麼嘗試學習另一種語言來驗證您是否可以實際將其移植到另一種語言(因爲它在前端和後端很簡單而且有用,所以javascript會是我的投票),或者將算法編寫成僞代碼,是更多的語言不可知論者。大多數語言的代碼看起來都很相似。唯一需要注意的是,當你依賴於某種語言的某些方面(例如Java中的泛型或迭代器)時,你可能無法在另一種語言中使用該方面,這可能會在理解上留下空白。

驗證您是否真正理解算法的另一種方法是對問題進行細微更改,並確保您可以調整算法以繼續工作。例如,如果它是一個排序算法,那麼嘗試按照幾個不同的屬性排序,而不是僅排序一個,如果它是一個圖算法,則使該圖成爲有向圖,並查看事情應該如何改變。

2

關於算法,它們本質上是與語言無關的。沒有什麼能阻止你在C,Python或其他語言中使用Sedgewick的例子。

如果你真的不知道任何其他語言,請專注於Java。當然,它有點重複,但這些部分會以一種很好的方式留在你的腦海中,然後到測試時間,你會爲這些信息感到高興。

你現在處於一個有趣的位置,因爲編寫程序所需的思維方式與正常思維有很大不同。除此之外,你正在用不同的語法,標點符號等學習一門全新的語言。實踐確實做得很完美,因爲有很多零碎要記住。

哦,如果你想練習算法,試試project euler,code kata和其他挑戰網站。這些小小的挑戰可以幫助你熟悉這門語言,並熟悉所需的思維類型。

1

首先,恭喜你學習如何編碼的第一步。我想說,你已經在夏天開始展望未來,已經領先於同齡人。

只要您擔心只能在Java中實現算法,您已經證明它不會對您造成問題。這聽起來像是你有足夠的熱情來早點開始,所以你應該沒有問題以多種語言實現解決方案。此外,大多數使用C/C++語言(Java和C#等)的語法都非常類似,您將能夠無縫地翻譯您的知識。

我可以給的最好的建議是代碼,代碼,代碼!不要只讀了算法實際實現它們。

0

我正在學習算法,好像我正在學習彈吉他 - 重複後的重複。

然後你沒有學習算法。你正在學習重複。兩件不同的事情。算法書籍使用編程語言是次要因素。它只是一個指令的載體,一個實現細節。

什麼,你應該重點是理解的結構,邏輯和算法的數學特性(也可能是與它相關的數據結構(一個或多個)。)

這是你的重點應該是什麼。

但這樣做我覺得我更加迷戀,我將只能 在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語言中面向對象的功能只是阻礙。

算法是一種數學結構,具有描述(操作)和/或什麼(數學)的性質。前者非常適合程序編程,後者則適用於函數式編程。

+0

我想我的比喻很差,但我的意思是我試圖理解這些概念。如果必須重新閱讀(我重複閱讀了很多次,直到點擊)。除了通過在java中實現它來「測試我的知識」之外,因爲java是我唯一知道的語言。即使我第一次正確地實施它,我也會這樣做,因爲我真的想把它作爲一個長期的事情。 – user1164937

+0

另外,我對Haskell很感興趣。當我想到第二種語言時非常多。我有一個概念,即功能語言不會受到傷害,因爲我聽說它是​​一個完全不同的球場,所以我不會與java混淆(我只有一個學期的經驗值)。你怎麼看? – user1164937

+0

「你怎麼看?」 - 重點。國際海事組織,如果你只知道一種語言(Java),我認爲你正在爲自己學習算法而不自己學習,而沒有多樣化的接觸其他語言。除了天生具有天賦的學習算法(但真的,真的,真正學習它們)需要學生進行一定的編程練習(理想情況下用幾種語言)。在參與學習算法之前,您應該能夠編寫諸如Java,C和Python(例如)的半複雜複雜程序。國際海事組織,這就像學習沒有代數的微積分。 –