當前位置:首頁 » 服務存儲 » 常見圖的存儲結構哪三種
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

常見圖的存儲結構哪三種

發布時間: 2023-01-13 19:26:43

『壹』 有關圖的存儲結構

(1)順序存儲方法
該方法把邏輯上相鄰的結點存儲在物理位置上相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接關系來體現。
由此得到的存儲表示稱為順序存儲結構 (Sequential Storage Structure),通常藉助程序語言的數組描述。
該方法主要應用於線性的數據結構。非線性的數據結構也可通過某種線性化的方法實現順序存儲。 (2)鏈接存儲方法
該方法不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關系由附加的指針欄位表示。由此得到的存儲表示稱為鏈式存儲結構(Linked Storage Structure),通常藉助於程序語言的指針類型描述。

『貳』 關於數據結構中圖的儲存方式的選擇

首先你要明白,鄰接鏈表存圖的空間復雜度與圖中邊的數量有關(O(N+E) E表示圖中邊的數目),而數組存圖空間復雜度與點數有關(O(N^2)N表示點數)
看點的數量,如果點的數量不是很大(比如幾百個左右或者更小)那麼二者都可以選擇。
如果點的數量過大的話,用數組存儲稀疏圖會造成大量的空間浪費,此時選擇使用鄰接表更好。

『叄』 圖的五種存儲結構

圖的鄰接矩陣(Adjacency Matrix): 圖的鄰接矩陣用兩個數組來表示圖。一個一維數組存儲圖中頂點信息,另一個二維數組(一般稱之為鄰接矩陣)來存儲圖中的邊或者弧的信息。從鄰接矩陣中我們自然知道一個頂點的度(對於無向圖)或者有向圖中一個頂點的入度出度信息。

假設圖G有n個頂點,則鄰接矩陣是一個n*n的方陣。
1.對於如果圖上的每條邊不帶權值來說,那麼我們就用真(一般為1)和假(一般為0)來表示一個頂點到另一個頂點存不存在邊。下面是一個圖的鄰接矩陣的定義:

鄰接矩陣法實現帶權值的無向圖的創建如下:

按照如圖輸入各邊(不重復)

測試程序如下:

結果可得該矩陣,證明創建樹成功。 假設n個頂點e條邊的創建,createGraph演算法的時間復雜度為O(n+n*n+e)。如果需要創建一個有向圖,那麼和上面一樣一個一個錄入邊下標和權值。

鄰接矩陣這種存儲結構的優缺點: 缺點是對於邊數相對頂點較少的稀疏圖來說會存在極大的空間浪費。假設有n個頂點,優點是對於有向完全圖和無向完全圖來說鄰接矩陣是一種不錯的存儲結構,浪費的話也只浪費了n個頂點的容量。

在樹的存儲結構一節中我們提到對於孩子表示法的第三種:用一段連續的存儲單元(數組)存儲樹中的所有結點,利用一個單鏈表來存儲數組中每個結點的孩子的信息。對於圖的存儲結構來說,我們也可以利用這種方法實現圖的存儲

鄰接表(Adjacency List): 這種數組與鏈表相結合的存儲方法叫做鄰接表。1.為什麼不也用單鏈表存儲圖的結點信息呢?原因就是數組這種順序存儲結構讀取結點信息速率快。對於頂點數組中,每個數據元素還需要存儲一個指向第一個鄰接頂點的指針,這樣才可以查找邊的信息2.圖中每個頂點Vi(i > 0)的所有鄰接點構成一個線性表 (在無向圖中這個線性表稱為Vi的邊表,有向圖中稱為頂點作為弧尾的出邊表) ,由於鄰接點的不確定性,所以用鏈表存儲,有多少個鄰接點就malloc一個空間存儲鄰接點,這樣更不會造成空間的浪費(與鄰接矩陣相比來說)。3.對於鄰接表中的某個頂點來說,用戶關心的是這個頂點的鄰接點,完全可以遍歷用單鏈表設計成的邊表或者出邊表得到,所以沒必要設計成雙鏈表。

鄰接表的存儲結構:
假設現在有一無向圖G,如下圖:

從鄰接表結構中,知道一個頂點的度或者判斷兩個頂點之間是否存在邊或者求一個頂點的所有鄰接頂點是很容易的。

假設現在有一有向圖G,如下圖:

無向圖的鄰接表創建示例如下:

假設在上圖(無向圖)中的V0V1V2V3頂點值為ABCD,則依據下面測試程序可得結果:

鄰接表的優缺點: 優點是:鄰接表存儲圖,既能夠知道一個頂點的度和頂點的鄰接結點的信息,並且更不會造成空間的浪費。缺點是鄰接表存儲有向圖時,如果關心的是頂點的出度問題自然用鄰接表結構,但是想了解入度需要遍歷圖才知道(需要考慮逆鄰接表)。

十字鏈表(Orthogonal List) :有向圖的一種存儲方法,它把鄰接表和逆鄰接表結合起來,因此在十字鏈表結構中可以知道一個頂點的入度和出度情況。
重新定義頂點表的結點如下圖:

現在有一有向圖如下圖:

則它的存儲結構示意圖為:

其定義如下:

十字鏈表是用來存儲有向圖的,這樣可以看出一個頂點的出入度信息。對於無向圖來說完全沒必要用十字鏈表來存儲。

在無向圖中,因為我們關注的是頂點的信息,在考慮節約空間的情況下我們利用鄰接表來存儲無向圖。但是如果我們關注的是邊的信息,例如需要刪除某條邊對於鄰接表來說是挺繁瑣的。它需要操作兩個單鏈表刪除兩個結點。因此我們仿照十字鏈表的方式對邊表結點結構重新定義如下圖:

它的鄰接多重表結構為:

多重鄰接表的優點:對於邊的操作相比於鄰接表來說更加方便。比如說我們現在需要刪除(V0,V2)這條邊,只需將69步驟中的指針改為nullptr即可。

邊集數組(edgeset array): 邊集數組是由兩個數組組成,一個存儲頂點信息,另一個存儲邊的信息,這個邊數組中的每個數據元素由起點下標,終點下標,和權組成(如果邊上含有權值的話)。
邊數組結構如下圖:

邊集數組實現圖的存儲的優缺點:優點是對於邊的操作方便快捷,操作的只是數組元素。比如說刪除某條邊,只需要刪除一個數組元素。缺點是:對於圖的頂點信息,我們只有遍歷整個邊數組才知道,這個費時。因此對於關注邊的操作來說,邊集數組更加方便。

『肆』 圖的存儲結構有哪些

最常見的:
順序查找:適合順序結構和鏈式結構
二分查找:適合順序結構

其他的二叉查找樹、B-樹之類有自己的數據結構

『伍』 《數據結構》 常見的圖的存儲結構包括了哪些

矩陣,鏈表

『陸』 圖的三種存儲結構

設圖G有n (n 1) 個頂點,則鄰接矩陣是一個n階方陣。
當矩陣中的 [i,j] !=0(下標從1開始) ,代表其對應的第i個頂點與第j個頂點是連接的。

為圖G中的每一個頂點建立一個單鏈表,每條鏈表的結點元素為與該頂點連接的頂點。

可以看成是有向圖的鄰接表和逆鄰接表結合起來的一種鏈表。

『柒』 存儲結構有哪些

存儲結構有順序存儲和鏈接存儲。順序存儲和鏈接存儲是數據的兩種最基本的存儲結構。

1、順序存儲

順序存儲方法是把邏輯上相鄰的結點存儲在物理位置相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接關系來體現,由此得到的存儲表示稱為順序存儲結構。順序存儲結構是一種最基本的存儲表示方法,通常藉助於程序設計語言中的數組來實現。

2、鏈接存儲

鏈接存儲方法它不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關系是由附加的指針欄位表示的。由此得到的存儲表示稱為鏈式存儲結構,鏈式存儲結構通常藉助於程序設計語言中的指針類型來實現。

(7)常見圖的存儲結構哪三種擴展閱讀:

數據的存儲結構是指數據的邏輯結構在計算機中的表示。數據元素之間的關系有兩種不同的表示方法:順序映象和非順序映象,並由此得到兩種不同的存儲結構:順序存儲結構和鏈式存儲結構。

儲存系統的層次結構為了解決存儲器速度與價格之間的矛盾,出現了存儲器的層次結構。

『捌』 數據結構圖的存儲

圖的存儲有兩種方式:鄰接矩陣,鄰接表。

圖的深度優先和廣度優先遍歷的復雜度:
1、鄰接矩陣:矩陣包含n n個元素,在演算法中,共n個頂點,對每個頂點都要遍歷n次,所以時間復雜度為 O(n n)
2、鄰接表:包含n個頭節點和e個表節點,演算法中對所有節點都要遍歷一次,所以時間復雜度為O(n+e)

『玖』 圖的存儲結構是什麼

由於圖的結構比較復雜,任意兩個頂點之間都可能存在關系(邊),無法通過存儲位置表示這種任意的邏輯關系,所以,圖無法採用順序存儲結構。這一點同其他數據結構(如線性表、樹)不同。考慮圖的定義,圖是由頂點和邊組成的,所以,分別考慮如何存儲頂點和邊。圖常用的存儲結構有鄰接矩陣、鄰接表、十字鏈表和鄰接多重表。

『拾』 數據結構 - 圖

前面我們學習了線性表,棧、隊列和樹。前面三者都屬於線性表范疇,它的的數據元素是被串起來的,僅有線性關系,每個元素僅有一個直接前驅和一個直接後繼,是屬於一對一關系。在樹裡面,每個元素之間存在著明顯的層次關系,每一層的元素可能和下一層的多個元素相關,但只能和上一層的一個元素相關,屬於一對多的關系。而圖是一種較線性表和樹更為復雜的數據結構,在圖的結構中,節點和節點的關系是任意的,圖中任意兩個數據元素都可能相關。

定義 :圖( Graph )是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。

在圖中需要注意的是:

(1)線性表中我們把數據元素叫元素,樹中將數據元素叫結點,在圖中數據元素,我們則稱之為頂點(Vertex)。

(2)線性表可以沒有元素,稱為空表;樹中可以沒有節點,稱為空樹;但是,在圖中不允許沒有頂點(有窮非空性)。

(3)線性表中的各元素是線性關系,樹中的各元素是層次關系,而圖中各頂點的關系是用邊來表示(邊集可以為空)。

頂點Vi的度(Degree)是指在圖中與Vi相關聯的邊的條數。對於有向圖來說,有入度(In-degree)和出度(Out-degree)之分,有向圖頂點的度等於該頂點的入度和出度之和。

①若無向圖中的兩個頂點V1和V2存在一條邊(V1,V2),則稱頂點V1和V2鄰接(Adjacent);

②若有向圖中存在一條邊<V3,V2>,則稱頂點V3與頂點V2鄰接,且是V3鄰接到V2或V2鄰接直V3;

注意:無向圖中的邊使用小括弧「()」表示,而有向圖中的邊使用尖括弧「<>」表示。

在無向圖中,若從頂點Vi出發有一組邊可到達頂點Vj,則稱頂點Vi到頂點Vj的頂點序列為從頂點Vi到頂點Vj的路徑(Path)。

若從Vi到Vj有路徑可通,則稱頂點Vi和頂點Vj是連通(Connected)的。

圖的存儲結構除了要存儲圖中的各個頂點本身的信息之外,還要存儲頂點與頂點之間的關系,因此,圖的結構也比較復雜。常用的圖的存儲結構有鄰接矩陣和鄰接表等。

我們再來看一個有向圖樣例,如下圖所示的左邊。頂點數組為vertex[4]={v0,v1,v2,v3},弧數組arc[4][4]為下圖右邊這樣的一個矩陣。主對角線上數值依然為0。但因為是有向圖,所以此矩陣並不對稱,比如由v1到v0有弧,得到arc[1][0]=1,而v到v沒有弧,因此arc[0][1]=0。

註:由於存在n個頂點的圖需要n*n個數組元素進行存儲,當圖為稀疏圖時,使用鄰接矩陣存儲方法將會出現大量0元素,這會造成極大的空間浪費。這時,可以考慮使用鄰接表表示法來存儲圖中的數據。

首先,回憶我們在線性表時談到, 順序存儲結構 就存在預先分配內存可能造成存儲空間浪費的問題,於是引出了 鏈式存儲 的結構。同樣的,我們也可以考慮對邊或弧使用鏈式存儲的方式來避免空間浪費的問題。

鄰接表 由表頭節點和表節點兩部分組成,圖中每個頂點均對應一個存儲在數組中的表頭節點。如果這個表頭節點所對應的頂點存在鄰接節點,則把鄰接節點依次存放於表頭節點所指向的單向鏈表中。

上面的圖G1包含了"A,B,C,D,E,F,G"共7個頂點,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"共7條邊。

上圖右邊的矩陣是G1在內存中的鄰接表示意圖。每一個頂點都包含一條鏈表,該鏈表記錄了"該頂點的鄰接點的序號"。例如,第2個頂點(頂點C)包含的鏈表所包含的節點的數據分別是"0,1,3";而這"0,1,3"分別對應"A,B,D"的序號,"A,B,D"都是C的鄰接點。就是通過這種方式記錄圖的信息的。

鄰接表有向圖是指通過鄰接表表示的有向圖。

上面的圖G2包含了"A,B,C,D,E,F,G"共7個頂點,而且包含了"<A,B>,<B,C>,<B,E>,<B,F>,<C,E>,<D,C>,<E,B>,<E,D>,<F,G>"共9條邊。

上圖右邊的矩陣是G2在內存中的鄰接表示意圖。每一個頂點都包含一條鏈表,該鏈表記錄了"該頂點所對應的出邊的另一個頂點的序號"。例如,第1個頂點(頂點B)包含的鏈表所包含的節點的數據分別是"2,4,5";而這"2,4,5"分別對應"C,E,F"的序號,"C,E,F"都屬於B的出邊的另一個頂點。