數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記(二)

前面的一篇簡單的說了一下數(shù)據(jù)結(jié)構(gòu)的術(shù)語名詞,這篇我們依然按照課本上的順序來說。
接下來的是數(shù)據(jù)結(jié)構(gòu)的內(nèi)容

數(shù)據(jù)結(jié)構(gòu),到底是什么結(jié)構(gòu)?

前面我們說過,數(shù)據(jù)結(jié)構(gòu)就是為了使得數(shù)據(jù)能用計(jì)算機(jī)來處理而存在的。數(shù)據(jù)結(jié)構(gòu)是為了組織數(shù)據(jù),那么數(shù)據(jù)結(jié)構(gòu)具體包含著什么呢?

數(shù)據(jù)結(jié)構(gòu)包含著三大方面:邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)和數(shù)據(jù)的運(yùn)算


1.邏輯結(jié)構(gòu)

邏輯結(jié)構(gòu)描述了數(shù)據(jù)的組織方式。邏輯結(jié)構(gòu)的設(shè)計(jì)其實(shí)是與計(jì)算機(jī)科學(xué)領(lǐng)域沒有什么關(guān)系的,反而與離散數(shù)學(xué)有很大的關(guān)系。

在邏輯結(jié)構(gòu)的描述中,一個(gè)數(shù)據(jù)元素稱為一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)之間的邏輯關(guān)系因?yàn)橛胁煌奶匦?,故而分為以下四種基本類型:
(1)集合結(jié)構(gòu):所謂的集合結(jié)構(gòu)就是一籃子雞蛋,基本符合離散數(shù)學(xué)中集合的概念,但是不同的是,數(shù)學(xué)意義上的集合元素在當(dāng)前集合中有且只有一個(gè),但是在數(shù)據(jù)結(jié)構(gòu)這里,允許有兩個(gè)除存儲空間外都完全相同的項(xiàng)。
(2)線性結(jié)構(gòu):線性結(jié)構(gòu)就類似穿起來的一串糖葫蘆,除了首節(jié)點(diǎn)和尾結(jié)點(diǎn)以外每個(gè)節(jié)點(diǎn)都有前驅(qū)和后綴,且相鄰有且只有一個(gè)直接前驅(qū)與直接后綴。
(3)樹形結(jié)構(gòu):符合數(shù)學(xué)概念里的樹形結(jié)構(gòu)。數(shù)據(jù)元素之間存在一對多的層級關(guān)系。
(4)圖狀結(jié)構(gòu):符合數(shù)學(xué)概念上的圖狀結(jié)構(gòu)。數(shù)據(jù)元素之間存在多對多的任意關(guān)系。


2.存儲結(jié)構(gòu)

存儲結(jié)構(gòu)則是拋開了“討厭的數(shù)學(xué)”,從計(jì)算機(jī)科學(xué)的角度去物理地描述數(shù)據(jù)具體是怎么樣存儲的。
在大一的時(shí)候幾乎所有的同學(xué)都接觸到了C語言,C語言的結(jié)構(gòu)化存儲主要是兩種方式:數(shù)組和鏈表。其實(shí)存儲結(jié)構(gòu)也主要就是順序存儲和鏈?zhǔn)酱鎯?/strong>(抽象意義),具象化到C語言中也就是數(shù)組和鏈表。
(1)順序存儲:借助元素之間的相對位置來表示元素之間的邏輯關(guān)系。這個(gè)有點(diǎn)像什么呢?舉個(gè)例子:某位討厭的班主任就喜歡以同學(xué)們的成績來排座位,讓第一名坐第一排,第二名坐第二排。假設(shè)沒有并列名次的同學(xué),那么座位就是這班同學(xué)的相對位置關(guān)系,同時(shí)要想知道任意一個(gè)同學(xué)的名次,通過數(shù)座位序號就可以知道。
這就是所謂的用相對位置表示元素之間的關(guān)系的意思,這也就是順序表最大的特點(diǎn)。
(2)鏈?zhǔn)酱鎯Γ烘湵淼奶攸c(diǎn)我們很清楚,因?yàn)槊總€(gè)節(jié)點(diǎn)在內(nèi)存中的位置是離散的,所以要實(shí)現(xiàn)一系列的元素的結(jié)構(gòu)的組織,就需要節(jié)點(diǎn)指針來表示各個(gè)元素之間的關(guān)系(如前驅(qū)或者后綴)。這個(gè)就好比快遞小哥按照著你所填好的地址,然后才能開著小摩托突突突地來到你的樓下大聲呼喚你的名字(這個(gè)小哥有點(diǎn)二)。那么,你的快遞上面寫著地址的單子,就是指向你的“存儲地址”的指針變量,你的快遞里面的寶貝就是節(jié)點(diǎn)的數(shù)據(jù)域中的東西。每個(gè)快遞包都是一個(gè)節(jié)點(diǎn),只不過節(jié)點(diǎn)的指向并不是下一個(gè)快遞而是你,快遞的地址就是對你的指向關(guān)系,本質(zhì)上沒有什么區(qū)別。


介紹完上面的東西,你可能會發(fā)現(xiàn),基本邏輯結(jié)構(gòu)有四種,但是存儲結(jié)構(gòu)只有順序和鏈?zhǔn)酱鎯煞N,那么,如果我有一棵樹,該怎么存到計(jì)算機(jī)中呢?

這時(shí)候我們要再說到兩個(gè)比較重要的東西,在后面我們會大量接觸到這兩個(gè)東西:
線性結(jié)構(gòu)與非線性結(jié)構(gòu)
這個(gè)線性說的就是邏輯結(jié)構(gòu),我們知道上面的四種邏輯關(guān)系里只有一個(gè)線性結(jié)構(gòu),那么其他的就都是非線性結(jié)構(gòu),我們按照這個(gè)方法去分類,就可得到:

線性結(jié)構(gòu):線性表、棧、隊(duì)列、字符串、數(shù)組、廣義表。
非線性結(jié)構(gòu):樹、圖。

新名詞看不懂不要緊,后面都會學(xué)到的。只要對接下來要學(xué)到的好多東西有個(gè)俯瞰角度的思路就好。

有一個(gè)很重要的點(diǎn)一定要說明:邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)不是相互孤立的,我們在處理數(shù)據(jù)的過程中,一般都是先設(shè)計(jì)好邏輯結(jié)構(gòu)的組織方式,然后選擇合適的存儲結(jié)構(gòu)去實(shí)現(xiàn)數(shù)據(jù)的組織,比較片面一點(diǎn)來說就是,邏輯結(jié)構(gòu)用來設(shè)計(jì),存儲結(jié)構(gòu)以及相關(guān)的算法用來實(shí)現(xiàn)。

這一篇并不會涉及到算法的相關(guān),但算法是數(shù)據(jù)結(jié)構(gòu)中不可或缺的一部分,不然數(shù)據(jù)組織好了,也用存儲結(jié)構(gòu)存儲在計(jì)算機(jī)里了,但是怎么才能讓計(jì)算機(jī)乖乖聽話去按照我們的設(shè)計(jì)去處理數(shù)據(jù)呢?很明顯摸摸頭和“芝麻開門”都是沒什么卵用的。這就要用到** 算法**啦!后面會有專門的部分去講算法,稍安勿躁。

以上基本上就是數(shù)據(jù)結(jié)構(gòu)的內(nèi)容結(jié)構(gòu)了。
如有錯(cuò)漏,懇請指教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容