[導(dǎo)讀]前幾天,小灰給大家介紹了什么是算法。說(shuō)到算法,就不能不說(shuō)起數(shù)據(jù)結(jié)構(gòu)。今天我來(lái)講一講,什么是數(shù)據(jù)結(jié)構(gòu)?程序員怎么學(xué)好數(shù)據(jù)結(jié)構(gòu)?我們介紹算法的時(shí)候說(shuō)過(guò),計(jì)算機(jī)當(dāng)中的算法,本質(zhì)就是一系列程序指令,用以解決特定的運(yùn)算和邏輯問(wèn)題。而所謂數(shù)據(jù)結(jié)構(gòu),是數(shù)據(jù)的組織、管理和存儲(chǔ)格式。簡(jiǎn)單理解的話,...
前幾天,小灰給大家介紹了什么是算法。
說(shuō)到算法,就不能不說(shuō)起數(shù)據(jù)結(jié)構(gòu)。今天我來(lái)講一講,什么是數(shù)據(jù)結(jié)構(gòu)?程序員怎么學(xué)好數(shù)據(jù)結(jié)構(gòu)?
我們介紹算法的時(shí)候說(shuō)過(guò),計(jì)算機(jī)當(dāng)中的算法,本質(zhì)就是一系列程序指令,用以解決特定的運(yùn)算和邏輯問(wèn)題。
而所謂數(shù)據(jù)結(jié)構(gòu),是數(shù)據(jù)的組織、管理和存儲(chǔ)格式。簡(jiǎn)單理解的話,數(shù)據(jù)結(jié)構(gòu)就是執(zhí)行算法的“原材料”。
俗話講,巧婦難為無(wú)米之炊。算法,就好比是聰明勤勞的女主人,而數(shù)據(jù)結(jié)構(gòu),就是用來(lái)做飯做菜的柴米油鹽。
數(shù)據(jù)結(jié)構(gòu)都有哪些組成方式呢?
首先,是線性結(jié)構(gòu)。
但凡有過(guò)一點(diǎn)編程基礎(chǔ)的小伙伴,肯定都知道數(shù)組,這就是一種典型的線性數(shù)據(jù)結(jié)構(gòu)。
除了數(shù)組以外,鏈表也是一種重要的數(shù)據(jù)結(jié)構(gòu)。Java集合框架中的LinkList類,底層實(shí)現(xiàn)就是鏈表。
以數(shù)組或者鏈表為基礎(chǔ),可以封裝出兩種數(shù)據(jù)結(jié)構(gòu),一個(gè)是棧,它的特點(diǎn)是先進(jìn)后出;另一個(gè)是隊(duì)列,它的特點(diǎn)是先進(jìn)先出。棧和隊(duì)列,可以滿足不同的特定需求。
其次,是樹。
樹,是一類一對(duì)多的數(shù)據(jù)結(jié)構(gòu),天生就非常適合用來(lái)檢索。Java集合框架當(dāng)中有一個(gè)TreeMap類,用于存儲(chǔ)鍵和值的映射,不但查找很高效,還能保證鍵的有序排列。它的底層實(shí)現(xiàn)就是一種名為紅黑樹的特殊二叉樹。
另外,我們操作系統(tǒng)當(dāng)中的文件索引,有很多都是用B樹實(shí)現(xiàn)的。
而我們常用的MySQL數(shù)據(jù)庫(kù),以B 樹作為常用索引。
再其次,是圖。
圖,是一類多對(duì)多的數(shù)據(jù)結(jié)構(gòu),非常適合用于表述眾多對(duì)象之間的復(fù)雜關(guān)系。大家肯定都乘坐過(guò)地鐵,一個(gè)城市的地鐵交通線路,站與站之間形成的關(guān)聯(lián),就是一個(gè)圖結(jié)構(gòu)。
在一群人之間,有著復(fù)雜的人際交往關(guān)系,他們所形成的的關(guān)系網(wǎng)絡(luò)也是一個(gè)圖結(jié)構(gòu)。
在圖的基礎(chǔ)上,產(chǎn)生了許多實(shí)用的算法。比如,我們用百度地圖或者高德地圖進(jìn)行導(dǎo)航的時(shí)候,背后就是圖的最短路徑算法。
最后,還有一些復(fù)合數(shù)據(jù)結(jié)構(gòu)。
比如咱們常用的哈希表,它的組成就是數(shù)組和鏈表的結(jié)合。
還有一種比較有意思的數(shù)據(jù)結(jié)構(gòu)叫做跳表,它在普通鏈表的基礎(chǔ)上,增加了很多個(gè)索引層。Redis當(dāng)中的集合 sortedSet,背后的數(shù)據(jù)結(jié)構(gòu)就是跳表。
復(fù)合數(shù)據(jù)結(jié)構(gòu),往往結(jié)合了多種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)當(dāng)然優(yōu)勢(shì),在特定的場(chǎng)景下非常有用。
這就是數(shù)據(jù)結(jié)構(gòu)的幾種組成方式,大家可以把這張圖保存一下。由于篇幅原因,圖里面所列出的具體數(shù)據(jù)結(jié)構(gòu),只是最最常用的幾種,并非全部。
那么,我們?cè)撊绾螌W(xué)好數(shù)據(jù)結(jié)構(gòu)呢?
就像學(xué)習(xí)算法一樣,我們同樣可以通過(guò)看書、看網(wǎng)上的視頻課程,來(lái)了解常用的數(shù)據(jù)結(jié)構(gòu)原理。
入門級(jí)別的書,比較推薦程杰老師的《大話數(shù)據(jù)結(jié)構(gòu)》,以及我自己出版的《漫畫算法》系列。
進(jìn)階級(jí)別的書,推薦看看《算法4》、《算法導(dǎo)論》。
課程的話,推薦極客時(shí)間王爭(zhēng)老師的《數(shù)據(jù)結(jié)構(gòu)與算法之美》,講的非常全面。
此外,我們也可以動(dòng)手去寫代碼,自己實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的基本功能,這樣印象會(huì)很深刻。
像紅黑樹這么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),一上來(lái)可能很難直接寫出來(lái)。我們可以從簡(jiǎn)單的開始,比如嘗試實(shí)現(xiàn)一個(gè)鏈表的添加節(jié)點(diǎn)和刪除節(jié)點(diǎn)功能,比如實(shí)現(xiàn)二叉樹的前序、中序、后序遍歷,等等。
最后,有些網(wǎng)站,會(huì)提供可視化的數(shù)據(jù)結(jié)構(gòu)演示,非常生動(dòng)。小伙伴們可以去這些網(wǎng)站看看。比如visuAlgo這個(gè)網(wǎng)站,就有著很豐富的案例。
大家還關(guān)注過(guò)哪些算法與數(shù)據(jù)結(jié)構(gòu)的教學(xué)網(wǎng)站,也歡迎在留言區(qū)寫出。
好了,關(guān)于數(shù)據(jù)結(jié)構(gòu),我就給大家介紹到這里。如果覺(jué)得這篇文章對(duì)你有幫助,希望可以點(diǎn)個(gè)在看點(diǎn)個(gè)贊,感謝大家~~
最近,小灰嘗試走出舒適區(qū),入駐B站開始錄制程序員相關(guān)的視頻。歡迎大家關(guān)注小灰的B站號(hào)【我是程序員小灰】,給個(gè)一鍵三連,感謝支持哦~~
欲知詳情,請(qǐng)下載word文檔
下載文檔
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
(全球TMT2022年7月11日訊)7月7日,由徑碩科技(JINGdigital)主辦、MEC睿達(dá)會(huì)承辦的“萬(wàn)數(shù)有靈·2022中國(guó)數(shù)字營(yíng)銷創(chuàng)新增長(zhǎng)峰會(huì)”在深圳舉行。作為一家營(yíng)銷科技公司,徑碩科技提供的是一流的營(yíng)銷軟件產(chǎn)...
關(guān)鍵字:
CE
DIGITAL
數(shù)字化
數(shù)據(jù)結(jié)構(gòu)
Redis為什么那么快?除了它是內(nèi)存數(shù)據(jù)庫(kù),使得所有的操作都在內(nèi)存上進(jìn)行之外,還有一個(gè)重要因素,它實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),使得我們對(duì)數(shù)據(jù)進(jìn)行增刪查改操作時(shí),Redis能高效的處理。因此,這次我們就來(lái)好好聊一下Redis數(shù)據(jù)結(jié)構(gòu),...
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
REDIS
字符串
節(jié)點(diǎn)
哈嘍,大家好,我是瓜哥,致力于分享互聯(lián)網(wǎng)各領(lǐng)域干貨。前幾天,有人問(wèn)瓜哥,學(xué)習(xí)編程語(yǔ)言有什么好的建議沒(méi)?今天簡(jiǎn)單和大家分享幾點(diǎn)學(xué)習(xí)編程的建議,希望可以幫助到大家。1.只要開始,就不要怕晚瓜哥經(jīng)??吹竭@些問(wèn)題,大四學(xué)編程還來(lái)...
關(guān)鍵字:
編程
代碼
基礎(chǔ)知識(shí)
數(shù)據(jù)結(jié)構(gòu)
大家好,我是小林。前幾天發(fā)了一篇「為了拿捏Redis數(shù)據(jù)結(jié)構(gòu),我畫了20張圖」,收獲了很多好評(píng),但是當(dāng)時(shí)急于發(fā)文,有些地方?jīng)]有寫完,也有些地方寫的不是很完善。然后我最近花了很多時(shí)間來(lái)完善文章,不僅加入了Redis新版本的...
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
REDIS
節(jié)點(diǎn)
字符串
大家好,我是小林。Redis為什么那么快?除了它是內(nèi)存數(shù)據(jù)庫(kù),使得所有的操作都在內(nèi)存上進(jìn)行之外,還有一個(gè)重要因素,它實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),使得我們對(duì)數(shù)據(jù)進(jìn)行增刪查改操作時(shí),Redis能高效的處理。因此,這次我們就來(lái)好好聊一下R...
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
REDIS
Redis為什么那么快?除了它是內(nèi)存數(shù)據(jù)庫(kù),使得所有的操作都在內(nèi)存上進(jìn)行之外,還有一個(gè)重要因素,它實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),使得我們對(duì)數(shù)據(jù)進(jìn)行增刪查改操作時(shí),Redis能高效的處理。因此,這次我們就來(lái)好好聊一下Redis數(shù)據(jù)結(jié)構(gòu),...
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
摘 要:大數(shù)據(jù)是從各種各樣來(lái)源中搜集得到的海量數(shù)據(jù)信息的總稱。從大數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)看, 大約90%的數(shù)據(jù)是非結(jié)構(gòu)化的,同時(shí)也也面臨復(fù)雜,性、安全和隱私風(fēng)險(xiǎn)等新挑戰(zhàn)。文章分析了企 業(yè)的大數(shù)據(jù)應(yīng)用,也提出了國(guó)家和政府部門未來(lái)建...
關(guān)鍵字:
大數(shù)據(jù)
政府部門
企業(yè)
數(shù)據(jù)結(jié)構(gòu)
最近在看數(shù)模的東西的時(shí)候發(fā)現(xiàn)了圖和網(wǎng)絡(luò)這一塊涉及到了數(shù)據(jù)結(jié)構(gòu)中的一些概念,于是將之前總結(jié)的數(shù)據(jù)結(jié)構(gòu)拿出來(lái)看一下,也當(dāng)是復(fù)習(xí),有需要查找的直接control + F查找
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
概念
如果你關(guān)注計(jì)算機(jī)專業(yè)招聘試題,會(huì)發(fā)現(xiàn)越是大型公司,問(wèn)的問(wèn)題越基礎(chǔ),有的甚至問(wèn)你什么是棧和隊(duì)列,反而一些小公司會(huì)關(guān)心你做過(guò)什么系統(tǒng)。從關(guān)注點(diǎn)的不同可以看出,大公司更注重基礎(chǔ)扎實(shí)和發(fā)展?jié)摿?,而小公司希望你立刻能夠?yàn)槠涓苫?。?..
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
編程
前幾天和一個(gè)粉絲聊面試,他說(shuō)去年同時(shí)拿到了阿里和網(wǎng)易的offer,最后選擇了阿里。我了解了下他的面試過(guò)程,就一點(diǎn),無(wú)論是網(wǎng)易還是阿里的面試,其中一個(gè)占比非常大的權(quán)重就是數(shù)據(jù)結(jié)構(gòu)與算法。其實(shí)現(xiàn)在不管面試什么崗位,前端也好,...
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
程序員
快速介紹8種常用數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)是一種特殊的組織和存儲(chǔ)數(shù)據(jù)的方式,可以使我們可以更高效地對(duì)存儲(chǔ)的數(shù)據(jù)執(zhí)行操作。數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)科學(xué)和軟件工程領(lǐng)域具有廣泛而多樣的用途。幾乎所有已開發(fā)的程序或軟件系統(tǒng)都使用數(shù)據(jù)結(jié)構(gòu)。此外,數(shù)...
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
程序員
01—順序棧棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),棧的實(shí)現(xiàn)方式主要有2種,順序棧和鏈棧。順序棧則是棧的元素虛擬內(nèi)存地址是連續(xù)的,鏈棧則是棧元素虛擬地址非連續(xù)的。在C語(yǔ)言里數(shù)組的元素虛擬地址是連續(xù)的但是數(shù)組大小必須在編譯的時(shí)候確定,...
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
hi,大家好,今天分享一些對(duì)數(shù)據(jù)結(jié)構(gòu)和算法精華總結(jié),希望對(duì)大家的面試或者工作有一定的幫助;看完本文可以學(xué)到什么知道哪些數(shù)據(jù)結(jié)構(gòu)和算法在實(shí)際工作中最常用,最重要理解一些設(shè)計(jì)上注意事項(xiàng)(經(jīng)驗(yàn)總結(jié))掌握常用數(shù)據(jù)結(jié)構(gòu)和算法核心知...
關(guān)鍵字:
數(shù)據(jù)結(jié)構(gòu)
前言ArrayList是Java集合框架中比較常用的數(shù)據(jù)結(jié)構(gòu)了。繼承自AbstractList,實(shí)現(xiàn)了List接口。底層基于數(shù)組實(shí)現(xiàn)容量大小動(dòng)態(tài)變化。一看就是一個(gè)比較重要的模塊,所以我們今天就來(lái)學(xué)習(xí)一下ArrayList...
關(guān)鍵字:
ArrayList
集合
數(shù)據(jù)結(jié)構(gòu)
有的小伙伴說(shuō)沒(méi)有學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu),對(duì)鏈表不是特別了解,所以今天我們就來(lái)對(duì)鏈表進(jìn)行一個(gè)系統(tǒng)的總結(jié),另外大家如果想提高算法思想的話,我建議還是要系統(tǒng)的學(xué)一下數(shù)據(jù)結(jié)構(gòu)的。
關(guān)鍵字:
鏈表
數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)這門課程是計(jì)算機(jī)相關(guān)專業(yè)的基礎(chǔ)課,數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)在計(jì)算機(jī)中的存儲(chǔ)、組織方式。我們?cè)趯W(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí)候,會(huì)遇到各種各樣的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),比如堆棧、隊(duì)列、數(shù)組、鏈表、樹...這些基本的數(shù)據(jù)結(jié)構(gòu)類型有各自的特點(diǎn),不同數(shù)...
關(guān)鍵字:
嵌入式
數(shù)據(jù)結(jié)構(gòu)