如何開始學習數(shù)據(jù)結構和算法
今天,由于高級語言的進步,您可以在不深入研究這些概念的情況下開始編程生涯。這既是好事也是壞事。
一方面,你可以加快學習編碼的速度,減少基本工作的挫敗感。大多數(shù)著名的數(shù)據(jù)結構、算法和設計模式都融入了流行的編程語言。另一方面,不知道幕后發(fā)生了什么會導致選擇錯誤的解決方案和技術,并編寫出不是最佳的代碼。
對于自學者來說尤其如此,自學者在開發(fā)者社區(qū)中占了相當大的比例。有一段時間,我一直在尋找一本關于數(shù)據(jù)結構和算法的入門書籍。
學習基礎知識
雖然這個名字聽起來有點傻(對于編程,我喜歡非常平淡的名字,比如“機器學習入門”或“高級JavaScript安全性”),有趣的數(shù)據(jù)結構實際上很有深度。
這本書從計算機體系結構的一些基礎知識開始,包括內存結構,變量和數(shù)組是如何存儲的,數(shù)據(jù)結構是什么樣子的,等等。請注意,JavaScript和Python等高級語言使用自己的動態(tài)數(shù)據(jù)存儲范例,您需要查看它們的詳細文檔(例如,V8引擎中的內存存儲)。然而,了解內存存儲的基本原理總是很有幫助的。
帶你了解所有主要的算法。您將了解流行的搜索算法,如快速排序、樹排序和冒泡排序。您還將了解主要數(shù)據(jù)結構的機制,如鏈表、雙向鏈表、堆棧、堆、四叉樹和八叉樹。
即使您不打算手動實現(xiàn)這些算法和數(shù)據(jù)結構,了解它們也是很重要的。例如,有幾種方法可以存儲數(shù)組和索引列表。這些數(shù)據(jù)類型的接口在很大程度上是重疊的,在某些情況下它們可以互換使用。但是他們使用的算法是非常不同的,這可能導致不同的性能水平取決于你如何使用它們。每種語言的文檔通常會說明哪種算法在每種類型的容器的幕后工作。
這些算法和結構中的一些針對索引訪問進行了優(yōu)化,而另一些則適合順序訪問。有些在規(guī)模靜態(tài)時性能更好,而有些則設計為動態(tài)增長。了解這些小細節(jié)非常重要,尤其是在處理非常大的數(shù)據(jù)集時。
因此,了解排序和存儲的機制將非常有助于為變量選擇最佳的存儲方法。(我必須再次指出,不同的語言在數(shù)據(jù)存儲方面有各自的細微差別,但基本思想是相同的。)
有趣的例子
我喜歡的一件事是有趣的數(shù)據(jù)結構庫比卡展示例子的方式。在整本書中,你會看到一些關于咖啡豆的假設例子來解釋復雜的軟件概念。
Kubica使用類似Python的偽代碼來顯示例子,有好有壞。一方面,這些例子很容易瀏覽,尤其是當它們變長的時候。另一方面,您必須自己完成完整的實現(xiàn)。話又說回來,這并不是一件太糟糕的事情,因為它迫使你編寫自己的代碼并更好地學習。
期間有趣的數(shù)據(jù)結構不是數(shù)據(jù)結構和算法的最終指南,顧名思義,它是一個有趣的主題介紹。作為一個多次研究和實現(xiàn)數(shù)據(jù)結構和算法的人,我發(fā)現(xiàn)這本書令人耳目一新,尤其是在一些更高級的主題上,如跳過列表和bloom filters。
Kubica的書可能是一個很好的開端,讓你踏上深入探索數(shù)據(jù)結構和算法的旅程。