如何開(kāi)始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法
當(dāng)我在90年代中期十幾歲的時(shí)候開(kāi)始學(xué)習(xí)編程時(shí),我必須學(xué)習(xí)很多關(guān)于搜索和排序算法、鏈表、智能指針、二叉樹(shù)和四叉樹(shù)、設(shè)計(jì)模式、內(nèi)存管理等等。
今天,由于Python和JavaScript等高級(jí)語(yǔ)言的進(jìn)步,您可以在不深入研究這些概念的情況下開(kāi)始編程生涯。這既是好事也是壞事。
一方面,你可以加快學(xué)習(xí)編碼的速度,減少基本工作的挫敗感。大多數(shù)著名的數(shù)據(jù)結(jié)構(gòu)、算法和設(shè)計(jì)模式都融入了流行的編程語(yǔ)言。另一方面,不知道幕后發(fā)生了什么會(huì)導(dǎo)致選擇錯(cuò)誤的解決方案和技術(shù),并編寫(xiě)出不是最佳的代碼。
對(duì)于自學(xué)者來(lái)說(shuō)尤其如此,自學(xué)者在開(kāi)發(fā)者社區(qū)中占了相當(dāng)大的比例。有一段時(shí)間,我一直在尋找一本關(guān)于數(shù)據(jù)結(jié)構(gòu)和算法的入門(mén)書(shū)籍。
我最近有機(jī)會(huì)閱讀有趣的數(shù)據(jù)結(jié)構(gòu) 作者Jeremy Kubica,他發(fā)現(xiàn)這是新手程序員以及希望提高關(guān)鍵軟件概念知識(shí)的開(kāi)發(fā)人員的最佳書(shū)籍。
學(xué)習(xí)基礎(chǔ)知識(shí)
雖然這個(gè)名字聽(tīng)起來(lái)有點(diǎn)傻(對(duì)于編程,我喜歡非常平淡的名字,比如“機(jī)器學(xué)習(xí)入門(mén)”或“高級(jí)JavaScript安全性”),有趣的數(shù)據(jù)結(jié)構(gòu)實(shí)際上很有深度。
這本書(shū)從計(jì)算機(jī)體系結(jié)構(gòu)的一些基礎(chǔ)知識(shí)開(kāi)始,包括內(nèi)存結(jié)構(gòu),變量和數(shù)組是如何存儲(chǔ)的,數(shù)據(jù)結(jié)構(gòu)是什么樣子的,等等。請(qǐng)注意,JavaScript和Python等高級(jí)語(yǔ)言使用自己的動(dòng)態(tài)數(shù)據(jù)存儲(chǔ)范例,您需要查看它們的詳細(xì)文檔(例如,V8引擎中的內(nèi)存存儲(chǔ))。然而,了解內(nèi)存存儲(chǔ)的基本原理總是很有幫助的。
Kubica帶你了解所有主要的算法。您將了解流行的搜索算法,如快速排序、樹(shù)排序和冒泡排序。您還將了解主要數(shù)據(jù)結(jié)構(gòu)的機(jī)制,如鏈表、雙向鏈表、堆棧、堆、四叉樹(shù)和八叉樹(shù)。
即使您不打算手動(dòng)實(shí)現(xiàn)這些算法和數(shù)據(jù)結(jié)構(gòu),了解它們也是很重要的。例如,在Python中,有幾種方法可以存儲(chǔ)數(shù)組和索引列表。這些數(shù)據(jù)類(lèi)型的接口在很大程度上是重疊的,在某些情況下它們可以互換使用。但是他們使用的算法是非常不同的,這可能導(dǎo)致不同的性能水平取決于你如何使用它們。每種語(yǔ)言的文檔通常會(huì)說(shuō)明哪種算法在每種類(lèi)型的容器的幕后工作。
這些算法和結(jié)構(gòu)中的一些針對(duì)索引訪問(wèn)進(jìn)行了優(yōu)化,而另一些則適合順序訪問(wèn)。有些在規(guī)模靜態(tài)時(shí)性能更好,而有些則設(shè)計(jì)為動(dòng)態(tài)增長(zhǎng)。了解這些小細(xì)節(jié)非常重要,尤其是在處理非常大的數(shù)據(jù)集時(shí)。
因此,了解排序和存儲(chǔ)的機(jī)制將非常有助于為變量選擇最佳的存儲(chǔ)方法。(我必須再次指出,不同的語(yǔ)言在數(shù)據(jù)存儲(chǔ)方面有各自的細(xì)微差別,但基本思想是相同的。)
有趣的例子
我喜歡的一件事是有趣的數(shù)據(jù)結(jié)構(gòu)庫(kù)比卡展示例子的方式。在整本書(shū)中,你會(huì)看到一些關(guān)于咖啡豆的假設(shè)例子來(lái)解釋復(fù)雜的軟件概念。
Kubica使用類(lèi)似Python的偽代碼來(lái)顯示例子,有好有壞。一方面,這些例子很容易瀏覽,尤其是當(dāng)它們變長(zhǎng)的時(shí)候。另一方面,您必須自己完成完整的實(shí)現(xiàn)。話(huà)又說(shuō)回來(lái),這并不是一件太糟糕的事情,因?yàn)樗仁鼓憔帉?xiě)自己的代碼,并且學(xué)得更好。
在…期間有趣的數(shù)據(jù)結(jié)構(gòu)不是數(shù)據(jù)結(jié)構(gòu)和算法的最終指南,顧名思義,它是一個(gè)有趣的主題介紹。作為一個(gè)多次研究和實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和算法的人,我發(fā)現(xiàn)這本書(shū)令人耳目一新,尤其是在一些更高級(jí)的主題上,如跳過(guò)列表和bloom filters。
Kubica的書(shū)可能是一個(gè)很好的開(kāi)端,讓你踏上深入探索數(shù)據(jù)結(jié)構(gòu)和算法的旅程。
- 上一篇
什么是虛擬化?
如今,“虛擬化”是軟件部署和IT世界中一個(gè)非常常見(jiàn)的術(shù)語(yǔ)。大多數(shù)公司不僅利用這項(xiàng)技術(shù)來(lái)部署他們的應(yīng)用程序,而且虛擬化映像還被IT部門(mén)用來(lái)為組織中的新員工提供新系統(tǒng)。
- 下一篇
什么是矢量相似性搜索及其用途?
現(xiàn)代數(shù)據(jù)搜索是一個(gè)復(fù)雜的領(lǐng)域。矢量相似性搜索或VSS表示具有上下文深度的數(shù)據(jù),并向消費(fèi)者返回更多相關(guān)信息以響應(yīng)搜索查詢(xún)。讓我們舉一個(gè)簡(jiǎn)單的例子。像“數(shù)據(jù)科學(xué)&rdq