前面的一篇簡單的說了一下數(shù)據(jù)結(jié)構的術語名詞,這篇我們依然按照課本上的順序來說。
接下來的是數(shù)據(jù)結(jié)構的內(nèi)容
數(shù)據(jù)結(jié)構,到底是什么結(jié)構?
前面我們說過,數(shù)據(jù)結(jié)構就是為了使得數(shù)據(jù)能用計算機來處理而存在的。數(shù)據(jù)結(jié)構是為了組織數(shù)據(jù),那么數(shù)據(jù)結(jié)構具體包含著什么呢?
數(shù)據(jù)結(jié)構包含著三大方面:邏輯結(jié)構、存儲結(jié)構和數(shù)據(jù)的運算
1.邏輯結(jié)構
邏輯結(jié)構描述了數(shù)據(jù)的組織方式。邏輯結(jié)構的設計其實是與計算機科學領域沒有什么關系的,反而與離散數(shù)學有很大的關系。
在邏輯結(jié)構的描述中,一個數(shù)據(jù)元素稱為一個節(jié)點,節(jié)點之間的邏輯關系因為有不同的特性,故而分為以下四種基本類型:
(1)集合結(jié)構:所謂的集合結(jié)構就是一籃子雞蛋,基本符合離散數(shù)學中集合的概念,但是不同的是,數(shù)學意義上的集合元素在當前集合中有且只有一個,但是在數(shù)據(jù)結(jié)構這里,允許有兩個除存儲空間外都完全相同的項。
(2)線性結(jié)構:線性結(jié)構就類似穿起來的一串糖葫蘆,除了首節(jié)點和尾結(jié)點以外每個節(jié)點都有前驅(qū)和后綴,且相鄰有且只有一個直接前驅(qū)與直接后綴。
(3)樹形結(jié)構:符合數(shù)學概念里的樹形結(jié)構。數(shù)據(jù)元素之間存在一對多的層級關系。
(4)圖狀結(jié)構:符合數(shù)學概念上的圖狀結(jié)構。數(shù)據(jù)元素之間存在多對多的任意關系。
2.存儲結(jié)構
存儲結(jié)構則是拋開了“討厭的數(shù)學”,從計算機科學的角度去物理地描述數(shù)據(jù)具體是怎么樣存儲的。
在大一的時候幾乎所有的同學都接觸到了C語言,C語言的結(jié)構化存儲主要是兩種方式:數(shù)組和鏈表。其實存儲結(jié)構也主要就是順序存儲和鏈式存儲(抽象意義),具象化到C語言中也就是數(shù)組和鏈表。
(1)順序存儲:借助元素之間的相對位置來表示元素之間的邏輯關系。這個有點像什么呢?舉個例子:某位討厭的班主任就喜歡以同學們的成績來排座位,讓第一名坐第一排,第二名坐第二排。假設沒有并列名次的同學,那么座位就是這班同學的相對位置關系,同時要想知道任意一個同學的名次,通過數(shù)座位序號就可以知道。
這就是所謂的用相對位置表示元素之間的關系的意思,這也就是順序表最大的特點。
(2)鏈式存儲:鏈表的特點我們很清楚,因為每個節(jié)點在內(nèi)存中的位置是離散的,所以要實現(xiàn)一系列的元素的結(jié)構的組織,就需要節(jié)點指針來表示各個元素之間的關系(如前驅(qū)或者后綴)。這個就好比快遞小哥按照著你所填好的地址,然后才能開著小摩托突突突地來到你的樓下大聲呼喚你的名字(這個小哥有點二)。那么,你的快遞上面寫著地址的單子,就是指向你的“存儲地址”的指針變量,你的快遞里面的寶貝就是節(jié)點的數(shù)據(jù)域中的東西。每個快遞包都是一個節(jié)點,只不過節(jié)點的指向并不是下一個快遞而是你,快遞的地址就是對你的指向關系,本質(zhì)上沒有什么區(qū)別。
介紹完上面的東西,你可能會發(fā)現(xiàn),基本邏輯結(jié)構有四種,但是存儲結(jié)構只有順序和鏈式存儲兩種,那么,如果我有一棵樹,該怎么存到計算機中呢?
這時候我們要再說到兩個比較重要的東西,在后面我們會大量接觸到這兩個東西:
線性結(jié)構與非線性結(jié)構
這個線性說的就是邏輯結(jié)構,我們知道上面的四種邏輯關系里只有一個線性結(jié)構,那么其他的就都是非線性結(jié)構,我們按照這個方法去分類,就可得到:
線性結(jié)構:線性表、棧、隊列、字符串、數(shù)組、廣義表。
非線性結(jié)構:樹、圖。
新名詞看不懂不要緊,后面都會學到的。只要對接下來要學到的好多東西有個俯瞰角度的思路就好。
有一個很重要的點一定要說明:邏輯結(jié)構和存儲結(jié)構不是相互孤立的,我們在處理數(shù)據(jù)的過程中,一般都是先設計好邏輯結(jié)構的組織方式,然后選擇合適的存儲結(jié)構去實現(xiàn)數(shù)據(jù)的組織,比較片面一點來說就是,邏輯結(jié)構用來設計,存儲結(jié)構以及相關的算法用來實現(xiàn)。
這一篇并不會涉及到算法的相關,但算法是數(shù)據(jù)結(jié)構中不可或缺的一部分,不然數(shù)據(jù)組織好了,也用存儲結(jié)構存儲在計算機里了,但是怎么才能讓計算機乖乖聽話去按照我們的設計去處理數(shù)據(jù)呢?很明顯摸摸頭和“芝麻開門”都是沒什么卵用的。這就要用到** 算法**啦!后面會有專門的部分去講算法,稍安勿躁。
以上基本上就是數(shù)據(jù)結(jié)構的內(nèi)容結(jié)構了。
如有錯漏,懇請指教。