數(shù)據(jù)結(jié)構(gòu)間縱橫聯(lián)系探究論文

時間:2022-10-11 11:09:00

導語:數(shù)據(jù)結(jié)構(gòu)間縱橫聯(lián)系探究論文一文來源于網(wǎng)友上傳,不代表本站觀點,若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

數(shù)據(jù)結(jié)構(gòu)間縱橫聯(lián)系探究論文

摘要本文詳細闡述了數(shù)據(jù)結(jié)構(gòu)間的縱橫聯(lián)系,所謂“橫向聯(lián)系”是對各種數(shù)據(jù)結(jié)構(gòu)研究都從邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)、操作運算三方面出發(fā)的模式思想,所謂“縱向聯(lián)系”是以簡單數(shù)據(jù)結(jié)構(gòu)類型為基礎來實現(xiàn)對較復雜數(shù)據(jù)結(jié)構(gòu)類型的研究。

關(guān)鍵詞邏輯結(jié)構(gòu)存儲結(jié)構(gòu)操作運算橫向聯(lián)系縱向聯(lián)系

1引言

數(shù)據(jù)結(jié)構(gòu)作為計算機核心學科,其主要研究內(nèi)容:邏輯結(jié)構(gòu),物理存儲結(jié)構(gòu),操作(或算法)[1]。通常,算法的設計取決于數(shù)據(jù)的邏輯結(jié)構(gòu),算法的實現(xiàn)取決于數(shù)據(jù)的物理存儲結(jié)構(gòu)。

根據(jù)數(shù)據(jù)元素之間不同特性,把數(shù)據(jù)結(jié)構(gòu)劃分四種基本結(jié)構(gòu):(1)集合,(2)線型結(jié)構(gòu),(3)樹型結(jié)構(gòu),(4)圖狀結(jié)構(gòu)或網(wǎng)狀結(jié)構(gòu)。針對每種數(shù)據(jù)結(jié)構(gòu)均從邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)和操作運算等方面進行研究,是貫穿數(shù)據(jù)結(jié)構(gòu)研究始終的“紅線”,也是數(shù)據(jù)結(jié)構(gòu)研究的共同切入點,稱之為數(shù)據(jù)結(jié)構(gòu)的“橫向聯(lián)系”。從集合、線型結(jié)構(gòu)等基本數(shù)據(jù)結(jié)構(gòu)入手,以實現(xiàn)樹形結(jié)構(gòu)、圖或網(wǎng)狀結(jié)構(gòu)等較復雜結(jié)構(gòu)研究,實現(xiàn)數(shù)據(jù)元素間的關(guān)系從簡單到復雜探討,稱之為“縱向聯(lián)系”。

2邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)、操作運算的思想模式——數(shù)據(jù)結(jié)構(gòu)間的橫向聯(lián)系

邏輯結(jié)構(gòu)的定義、存儲結(jié)構(gòu)的實現(xiàn)、操作運算的實現(xiàn)是對數(shù)據(jù)結(jié)構(gòu)研究的基本思想,一種數(shù)據(jù)結(jié)構(gòu)的研究首先對這三方面內(nèi)容有一個清晰的探討。

集合數(shù)據(jù)結(jié)構(gòu)與數(shù)學中集合概念是一致的,其邏輯結(jié)構(gòu)元素間只是同屬關(guān)系。存儲結(jié)構(gòu)實現(xiàn)只是在計算機內(nèi)存儲,它的操作就是一些交、差、并、補等。

線型結(jié)構(gòu)是N個數(shù)據(jù)元素的有限序列,至于每一個數(shù)據(jù)元素的具體的含義在不同的情況下各不相同,其長度可根據(jù)需要增長或縮短,其邏輯結(jié)構(gòu)就是它的數(shù)據(jù)元素間的線形關(guān)系,即一個對一個,一個元素最多有一個前驅(qū),最多有一個后繼。它的存儲結(jié)構(gòu)的實現(xiàn)一般有順序存儲和鏈式存儲兩種方法。順序表是指用一組地址連續(xù)的存儲單元依次存儲線性結(jié)構(gòu)中的數(shù)據(jù)元素,這是一種隨機存取的存儲結(jié)構(gòu);鏈式存儲是數(shù)據(jù)元素之間的邏輯關(guān)系由結(jié)點中的指針來表示并且每一個結(jié)點有且只有一個指針域。線性結(jié)構(gòu)的操作中,最基本的操作是在線性結(jié)構(gòu)中插入、刪除數(shù)據(jù)元素。存儲結(jié)構(gòu)為順序存儲有線性順序表、數(shù)組、串等。存儲結(jié)構(gòu)為鏈式存儲結(jié)構(gòu)時有鏈表等。根據(jù)線性表的操作的不同便產(chǎn)生了兩種重要的數(shù)據(jù)結(jié)構(gòu)即棧和隊列,這兩種數(shù)據(jù)結(jié)構(gòu)是線性結(jié)構(gòu)的典型例子[2]。

樹型結(jié)構(gòu)是一種重要的非線性結(jié)構(gòu),其中的樹和二叉樹最為常用。直觀看來,樹是以分支關(guān)系定義的層次結(jié)構(gòu),其邏輯結(jié)構(gòu)是一對多的關(guān)系,而在二叉樹中是一個根結(jié)點對應左右兩個孩子的層次關(guān)系。存儲結(jié)構(gòu)的實現(xiàn)當采取順序存儲時用一組地址連續(xù)的存儲單元依上而下、自左向右存儲樹中的結(jié)點元素。在鏈式存儲結(jié)構(gòu)中可采用二叉鏈表表示法即鏈表中結(jié)點的兩個鏈域分別指向該結(jié)點的第一個孩子和下一個兄弟結(jié)點,樹形結(jié)構(gòu)的最基本的操作是遍歷,其它復雜的操作大部分就是遍歷操作的衍生與擴展。在樹型結(jié)構(gòu)中最有特色的一種數(shù)據(jù)結(jié)構(gòu)就是二叉樹,其獨特的邏輯結(jié)構(gòu)是每個結(jié)點至多有二棵子樹并且還有左右之分,這就決定著它獨特的鏈式存儲結(jié)構(gòu),每個數(shù)據(jù)元素有且只有兩個指針分別指向該結(jié)點的左右孩子。二叉樹的最基本的操作是遍歷二叉樹,對每個結(jié)點的訪問是對其它復雜操作的基礎,例如統(tǒng)計結(jié)點個數(shù)、統(tǒng)計葉子結(jié)點數(shù)、交換二叉樹的左右孩子等一些復雜的操作運算均是遍歷二叉樹操作的擴展和衍生?;诙鏄涞倪f歸定義可得到遍歷二叉樹遞歸算法,前序遍歷、中序遍歷、后序遍歷二叉樹。

圖狀結(jié)構(gòu)是一種較線型結(jié)構(gòu)和樹更復雜的數(shù)據(jù)結(jié)構(gòu),圖的邏輯結(jié)構(gòu)是多對多的關(guān)系即在圖形結(jié)構(gòu)中結(jié)點之間的關(guān)系是任意的。因此在存儲結(jié)構(gòu)中無法以數(shù)據(jù)元素在存儲區(qū)中的物理位置來表示數(shù)據(jù)元素間的關(guān)系。即圖沒有順序映象但可以借助數(shù)組的數(shù)據(jù)類型表示元素之間的關(guān)系,用兩個數(shù)組分別存儲數(shù)據(jù)元素(頂點)的信息和數(shù)據(jù)元素之間的關(guān)系信息[3]。另一方面圖的存儲結(jié)構(gòu)也可由多重鏈表實現(xiàn),即一個由一個數(shù)據(jù)域和多個指針域組成的結(jié)點來表示圖中的一個頂點,其中數(shù)據(jù)域存儲該頂點的信息,指針域存儲指向鄰接點的指針,但由于圖中各個結(jié)點的度各不相同,結(jié)點的指針域設定不易確定,則圖的鏈式存儲結(jié)構(gòu)可用鄰接多重表表示法,對圖中每個頂點建立一個單鏈表,第一個單鏈表的結(jié)點表示依附于頂點V的邊,每個結(jié)點由三個域組成其中鄰接點域指示頂點V的鄰接點在圖中的位置,鏈域指示下一條邊或弧的結(jié)點,數(shù)據(jù)域存儲和邊或弧相關(guān)的信息,如權(quán)值等。每個鏈表附有一個表頭結(jié)點。在表頭結(jié)點中除了設有鏈域指向鏈表中第一個結(jié)點外還設有存儲頂點的名或其它有關(guān)信息的數(shù)據(jù)域,這樣實現(xiàn)了圖的鏈式存儲。遍歷是最基本的操作也是最重要的操作運算,它是求解圖的連通性、拓撲排序和求關(guān)鍵路徑的基礎,然而圖的遍歷比樹的遍歷復雜的多,因為圖的任一頂點都有可能和其余的頂點相鄰接。所以在訪問某個頂點之后可能沿著某條路徑搜索之后又回到該頂點上。因此要設有一個輔助數(shù)組V[0..n-1],它的初始值置為假,一旦訪問頂點Vi,便置V[i]為真,這樣避免了同一個頂點被訪問多次,對圖的遍歷有深度優(yōu)先搜索和廣度優(yōu)先搜索。圖的深度優(yōu)先搜索遍歷類似樹的先根遍歷,是樹的先根遍歷的推廣。廣度優(yōu)先搜索類似樹的按層次遍歷的過程。圖狀結(jié)構(gòu)中復雜的操作大部分都是以圖的遍歷為基礎。

因此無論對于線型結(jié)構(gòu)、樹性結(jié)構(gòu)、網(wǎng)狀或圖,它們都遵循著邏輯結(jié)構(gòu)的定義、存儲結(jié)構(gòu)的實現(xiàn)、操作運算方法的實現(xiàn)模式來實現(xiàn)每種數(shù)據(jù)結(jié)構(gòu)的類型。在數(shù)據(jù)結(jié)構(gòu)研究中對每種數(shù)據(jù)結(jié)構(gòu)的研究只有對它的這三個方面內(nèi)容的研究,才能對它進行探索、掌握、改進。這是數(shù)據(jù)結(jié)構(gòu)研究中的基本思想。在數(shù)據(jù)結(jié)構(gòu)研究中當前面向各專門領(lǐng)域特殊問題的多維數(shù)據(jù)結(jié)構(gòu)和從抽象數(shù)據(jù)類型的觀點來討論數(shù)據(jù)結(jié)構(gòu),都不能背離這個思想。

3由棧和隊列實現(xiàn)樹、圖的遍歷——縱向聯(lián)系

遍歷操作對樹、圖結(jié)構(gòu)是很基礎、很重要的運算,它是實現(xiàn)一個數(shù)據(jù)結(jié)構(gòu)的核心部分,雖然根據(jù)樹、圖的遞歸定義能設計出樹、圖的遍歷的遞歸算法,但從線型結(jié)構(gòu)到樹、圖的發(fā)展也是數(shù)據(jù)結(jié)構(gòu)從簡單到復雜的逐步發(fā)展過程。線型結(jié)構(gòu)中棧和隊列是兩個非常重要的數(shù)據(jù)結(jié)構(gòu),對于樹、圖的遍歷可用棧和隊列來實現(xiàn)。對樹、圖復雜的數(shù)據(jù)結(jié)構(gòu),可通過棧和隊列的操作來實現(xiàn)復雜數(shù)據(jù)結(jié)構(gòu)的操作,體現(xiàn)了數(shù)據(jù)結(jié)構(gòu)間的“縱向聯(lián)系”。

用棧實現(xiàn)二叉樹的前序遍歷算法:

Statuspreorder(bitreet)

{P=t;

Initstack(s);

Push(s,p);

While(!stackempty(s)){

pop(s,p)

while(p){

visit(p);

push(s,p→rchild);

p=p-→lchild;}

}}

用棧實現(xiàn)二叉樹的中序遍歷算法:

Statusinorder(bitreet)

{p=t;

Initstack(s);

Push(s,p);

P=P→lchild;

while(!stackempty){

while(p){

push(s,p);

p=p-→lchild;}

pop(s,p);

visist(p);

p=p→rchild;}}

用棧來實現(xiàn)二叉樹的后序遍歷算法:

Statuspostorder(bitreet){

P=t;

inistack(s);

While(p||!stackempty(s)){

If(p){

push(s,p);

P=p→lchild;}

ElseIf(!stackempty(s)){

pre=null;

Gettop(s,p);

While(p→rchild==pre){pop(s,p);

Visit(p);

Pre=p;

Gettop(s,p);}

P=p→rchild;}

}}}

用隊列實現(xiàn)二叉樹層次遍歷算法:

VoidLayers(bitreet){

if(t){

p=t;

Initqueue(q);

Enqueue(q,t);

while(!empty(q)){

p=Dlqueue(q);

visit(p);

if(P→lchild)Enqueue(q,p→lchild);

if(p→rchild)Enqueue(q,p→rchild);}

}

用隊列實現(xiàn)圖的廣度優(yōu)先搜索算法:

VoidBfs(Graphg,intv){

Visit(v);

Visited[v]=true;

Enqueue(q,v);

While(!emptyqueue(q)){

Dlqueue(g,vex);

For(w=firstadjvex(g,vex),w,w=nextadjvex(g,vex,w)){

If(!visited[w]){visit(w);

Visited[w]=true;

Enqueue(q,w);}}

}}

VoidDfs(Graphg,intv){

Visit(v);

Visited[v]=true;

Push(s,v);

While(!emptystack(s)){V=gettop(s);

For(w=fistadjvex(g,v);w&&!visited[w];w=nextadjvex(g,v,w))

If(!w)pop(s)

Else{visit(w);

Visited[w]=true;

Push(s,w);}}

因為二叉樹、圖的其它的操作大部分是對遍歷基本操作的拓展或綜合應用,靈活運用棧和隊列可實現(xiàn),并且算法描述比較直觀。線性結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)學科的基礎,樹、圖的發(fā)展在線性結(jié)構(gòu)的基礎上而發(fā)展,因樹、圖發(fā)展促進著線性結(jié)構(gòu)中和一些算法的完善和改進,線型結(jié)構(gòu)、樹型結(jié)構(gòu)、圖狀結(jié)構(gòu)是緊密相聯(lián)的。

4抽象數(shù)據(jù)類型的研究

數(shù)據(jù)結(jié)構(gòu)間縱橫聯(lián)系明顯且緊密。運用與把握這種“縱橫聯(lián)系”,對從抽象數(shù)據(jù)類型的角度來進行數(shù)據(jù)結(jié)構(gòu)的學習與研究有著重要的借鑒意義。

抽象數(shù)據(jù)類型(ADT)的研究越來越被人所重視[4-8],它可理解為數(shù)據(jù)類型的進一步抽象。即把數(shù)據(jù)類型和數(shù)據(jù)類型上的運算捆在一起,進行封裝。引入抽象數(shù)據(jù)類型的目的是把數(shù)據(jù)類型的表示和數(shù)據(jù)類型上運算的實現(xiàn)與這些數(shù)據(jù)類型和運算在程序中的引用隔開,使它們相互獨立。對于抽象數(shù)據(jù)類型的描述,除了必須描述它的數(shù)據(jù)結(jié)構(gòu)外,還必須描述定義在它上面的運算(過程或函數(shù))。抽象數(shù)據(jù)類型上定義的過程和函數(shù)以該抽象數(shù)據(jù)類型的數(shù)據(jù)所應具有的數(shù)據(jù)結(jié)構(gòu)為基礎。它仍遵循邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)、操作運算的數(shù)據(jù)結(jié)構(gòu)基本思想,所有的抽象數(shù)據(jù)類型都可有簡單的分類策略獲得,這個策略就是抽象數(shù)據(jù)類型對象像什么和對它們做些什么。邏輯結(jié)構(gòu)定義、存儲結(jié)構(gòu)表示、操作的實現(xiàn)在抽象類型中它們被稱為數(shù)據(jù)類型說明、抽象數(shù)據(jù)類型的表示和抽象數(shù)據(jù)類型的實現(xiàn)[3]。抽象數(shù)據(jù)類型具體的表示和實現(xiàn)依賴所采用的語言,用戶可以用某高級語言的固有數(shù)據(jù)類型和自定義類型并借助于過程和函數(shù)來表示和實現(xiàn)抽象數(shù)據(jù)類型。

5結(jié)論

邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)、操作運算等核心方面是貫穿數(shù)據(jù)結(jié)構(gòu)研究與發(fā)展的一條基本線,也是數(shù)據(jù)結(jié)構(gòu)研究中所看到數(shù)據(jù)結(jié)構(gòu)間的“橫向聯(lián)系”。應用基本數(shù)據(jù)結(jié)來實現(xiàn)復雜數(shù)據(jù)結(jié)構(gòu)的方法與途徑,這是對數(shù)據(jù)元素之間關(guān)系從簡單到復雜的探討,即為“縱向聯(lián)系”。數(shù)據(jù)結(jié)構(gòu)聯(lián)系是對數(shù)據(jù)結(jié)構(gòu)的整體把握,體現(xiàn)在這種“橫向聯(lián)系”和“縱向聯(lián)系”之中。靈活運用與把握這種數(shù)據(jù)結(jié)構(gòu)間的關(guān)系,對抽象數(shù)據(jù)結(jié)構(gòu)類型的研究有重要的借鑒意義,同時對數(shù)據(jù)結(jié)構(gòu)的實際教學過程有著一定的指導意義。

參考文獻

[1]陸松年.數(shù)據(jù)結(jié)構(gòu)教程[M].北京:科學出版社.2002年

[2]嚴蔚敏.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].北京:清華大學出版社.1997年

[3]帥訓波.數(shù)據(jù)結(jié)構(gòu)間普遍整體聯(lián)系[D].曲阜:曲阜師范大學計算機科學學院.2003年

[4]藍雯飛.數(shù)據(jù)結(jié)構(gòu)的面向?qū)ο竺枋龇椒ㄑ芯縖J].計算機工程與應用,2006;42(26):79-80

[5]劉毅.關(guān)于Treap數(shù)據(jù)結(jié)構(gòu)問題的研究[J].計算機應用與軟件,2005;22(8):36-38

[6]胡澤明,岳瑞生,王志剛.嵌入式GIS線要素無縫拼接的數(shù)據(jù)結(jié)及實現(xiàn)算法[J].測繪科學,2006;31(5):102-103

[7]戴堅鋒,邵雷兵.一種新型的可擴展分布式數(shù)據(jù)結(jié)構(gòu)[J].計算機應用研究,2005;22(8):170-171

[8]李先國,梁涌.一種高效的適用于字詞檢索的數(shù)據(jù)結(jié)構(gòu)[J].微電子學與計算機,2006;23(12):157-160