主頁 > 知識(shí)庫(kù) > Python數(shù)據(jù)結(jié)構(gòu)之圖的存儲(chǔ)結(jié)構(gòu)詳解

Python數(shù)據(jù)結(jié)構(gòu)之圖的存儲(chǔ)結(jié)構(gòu)詳解

熱門標(biāo)簽:呼叫中心市場(chǎng)需求 美圖手機(jī) 檢查注冊(cè)表項(xiàng) 智能手機(jī) 銀行業(yè)務(wù) 鐵路電話系統(tǒng) 服務(wù)器配置 網(wǎng)站文章發(fā)布

一、圖的定義

圖是一種比樹更復(fù)雜的一種數(shù)據(jù)結(jié)構(gòu),在圖結(jié)構(gòu)中,結(jié)點(diǎn)之間的關(guān)系是任意的,任意兩個(gè)元素之間都可能相關(guān),因此,它的應(yīng)用極廣。圖中的數(shù)據(jù)元素通常被稱為頂點(diǎn) ( V e r t e x ) (Vertex) (Vertex), V V V是頂點(diǎn)的有窮非空集合, V R VR VR是兩個(gè)頂點(diǎn)之間的關(guān)系的集合(可以為空),可以表示為圖 G = { V , { V R } } G=\{V,\{VR\}\} G={V,{VR}}。

二、相關(guān)術(shù)語

2.1 無向圖

給定圖 G = { V , { E } } G=\{V,\{E\}\} G={V,{E}},若該圖中每條邊都是沒有方向的,則稱其為無向圖 ( U n d i g r a p h ) (Undigraph) (Undigraph)。對(duì)圖 G G G中頂點(diǎn) v v v和頂點(diǎn) w w w的關(guān)系,可用無序?qū)?( v , w ) (v,w) (v,w)表示,它是連接 v v v和 w w w的一條邊 ( E d g e ) (Edge) (Edge)。

2.2 有向圖

給定圖 G = { V , { A } } G=\{V,\{A\}\} G={V,{A}},若該圖中每條邊都是有方向的,則稱其為有向圖 ( D i g r a p h ) (Digraph) (Digraph)。對(duì)圖 G G G中頂點(diǎn) v v v和頂點(diǎn) w w w的關(guān)系,可用有序?qū)? v , w > v,w> v,w>表示,它是從 v v v到 w w w的一條弧 ( A r c ) (Arc) (Arc),其中 v v v被稱為弧尾 ( T a i l ) (Tail) (Tail), w w w被稱為弧頭 ( H e a d ) (Head) (Head)。

  弧尾也叫初始點(diǎn) ( I n i t i a l (Initial (Initial N o d e ) Node) Node),弧頭也叫終端點(diǎn) ( T e r m i n a l (Terminal (Terminal N o d e ) Node) Node)。

2.3 完全圖

對(duì)于任一無向圖,若其頂點(diǎn)的總數(shù)目為 n n n,邊的總數(shù)目為 e = n ( n − 1 ) 2 e=\frac {n(n-1)} {2} e=2n(n−1)​,則稱其為完全圖 ( C o m p l e t e d (Completed (Completed G r a p h ) Graph) Graph)。

2.4 有向完全圖

對(duì)于任一有向圖,若其頂點(diǎn)的總數(shù)目為 n n n,邊的總數(shù)目為 e = n ( n − 1 ) e=n(n-1) e=n(n−1),則稱其為有向完全圖

2.5 稀疏圖和稠密圖

對(duì)于具有 n n n個(gè)頂點(diǎn), e e e條邊或弧的圖來說,若 e e e很小,比如 e n log ⁡ n en\log n enlogn,則稱其為稀疏圖 ( S p a r s e (Sparse (Sparse G r a p h ) Graph) Graph),反之稱其為稠密圖 ( D e n s e (Dense (Dense G r a p h ) Graph) Graph)。

2.6 權(quán)和網(wǎng)

賦予圖中邊或弧的數(shù)值稱為權(quán) ( W e i g h t ) (Weight) (Weight),它可以表示從一個(gè)頂點(diǎn)到另一個(gè)頂點(diǎn)的距離;帶權(quán)的圖稱為網(wǎng) ( N e t w o r k ) (Network) (Network)。

2.7 稀疏網(wǎng)和稠密網(wǎng)

帶權(quán)的稀疏圖、稠密圖稱為稀疏網(wǎng)、稠密網(wǎng)

2.8 子圖

對(duì)于圖 G = { V , { E } } G=\{V,\{E\}\} G={V,{E}}和圖 G ′ = { V ′ , { E ′ } } G'=\{V',\{E'\}\} G′={V′,{E′}},若 V ′ ⊆ V V'\subseteq V V′⊆V且 E ′ ⊆ E E'\subseteq E E′⊆E,則稱 G ′ G' G′為 G G G的子圖 ( S u b g r a p h ) (Subgraph) (Subgraph)。

2.9 鄰接點(diǎn)

對(duì)于無向圖 G = { V , { E } } G=\{V,\{E\}\} G={V,{E}},若 v ∈ V v\in V v∈V、 w ∈ V w\in V w∈V且 ( v , w ) ∈ E (v,w)\in E (v,w)∈E,則稱頂點(diǎn) v v v和頂點(diǎn) w w w互為鄰接點(diǎn) ( A d j a c e n t ) (Adjacent) (Adjacent),并稱邊 ( v , w ) (v,w) (v,w)依附 ( I n c i d e n t ) (Incident) (Incident)于頂點(diǎn) v v v和頂點(diǎn) w w w,或稱邊 ( v , w ) (v,w) (v,w)與頂點(diǎn) v v v和頂點(diǎn) w w w相關(guān)聯(lián)。

對(duì)于有向圖 G = { V , { A } } G=\{V,\{A\}\} G={V,{A}},若 v ∈ V v\in V v∈V、 w ∈ V w\in V w∈V且 v , w > ∈ A v,w>\in A v,w>∈A,則稱頂點(diǎn) v v v鄰接到頂點(diǎn) w w w,頂點(diǎn) w w w鄰接自頂點(diǎn) v v v,并稱弧 v , w > v,w> v,w>與頂點(diǎn) v v v和頂點(diǎn) w w w相關(guān)聯(lián)。

2.10 度、入度與出度

在無向圖中,頂點(diǎn) v v v的 ( D e g r e e ) (Degree) (Degree)等于與該頂點(diǎn)相關(guān)聯(lián)的邊的數(shù)目,記為 T D ( v ) TD(v) TD(v)。

在有向圖中,頂點(diǎn) v v v的等于該頂點(diǎn)的入度與出度之和,記為 T D ( v ) = I D ( v ) + O D ( v ) TD(v)=ID(v)+OD(v) TD(v)=ID(v)+OD(v),其中頂點(diǎn) v v v的入度 ( I n D e g r e e ) (InDegree) (InDegree)為以該頂點(diǎn)為弧頭的弧的數(shù)目,記為 I D ( v ) ID(v) ID(v),頂點(diǎn) v v v的出度 ( O u t D e g r e e ) (OutDegree) (OutDegree)為以該頂點(diǎn)為弧尾的弧的數(shù)目,記為 O D ( v ) OD(v) OD(v)。

2.11 路徑、簡(jiǎn)單路徑與路徑長(zhǎng)度

路徑 ( P a t h ) (Path) (Path)是任意兩個(gè)有關(guān)聯(lián)的頂點(diǎn)之間的邊或弧,在圖 G = { V , { V R } } G=\{V,\{VR\}\} G={V,{VR}}中,頂點(diǎn) v 1 v_1 v1​到頂點(diǎn) v n v_n vn​的路徑是一個(gè)頂點(diǎn)序列 ( v 1 , v 2 , … , v i , v j , … , v n ) (v_1,v_2,\dots,v_i,v_j,\dots,v_n) (v1​,v2​,…,vi​,vj​,…,vn​),對(duì)于上述序列中的任意相鄰的頂點(diǎn) v i v_i vi​和 v j v_j vj​,若圖 G G G是無向圖,則有 ( v , w ) ∈ E (v,w)\in E (v,w)∈E,若圖 G G G是有向圖,則有 v , w > ∈ A v,w>\in A v,w>∈A。

對(duì)于給定的一條路徑,若該路徑對(duì)應(yīng)的序列中的頂點(diǎn)不重復(fù),則稱為該路徑為簡(jiǎn)單路徑。

路徑上邊或弧的數(shù)目稱為路徑長(zhǎng)度。

2.12 回路與簡(jiǎn)單回路

若某一路徑中的第一個(gè)頂點(diǎn)和最后一個(gè)頂點(diǎn)相同,則稱該路徑為回路,也稱為環(huán) ( C y c l e ) (Cycle) (Cycle)。

在某一回路中,若除去第一個(gè)頂點(diǎn)和最后一個(gè)頂點(diǎn)外,其余頂點(diǎn)均不重復(fù),則稱為該回路為簡(jiǎn)單回路,也稱為簡(jiǎn)單環(huán)。

2.13 連通圖與連通分量

無向圖中,若從頂點(diǎn) v v v到頂點(diǎn) w w w有路徑,則稱為 v v v到 w w w是連通的,若該圖中的任意兩個(gè)頂點(diǎn)間都是連通的,則稱該圖為連通圖 ( C o n n e c t e d (Connected (Connected G r a p h ) Graph) Graph)。無向圖中的極大連通子圖稱為連通分量 ( C o n n e c t e d (Connected (Connected C o m p o n e n t ) Component) Component)。這里的極大就是盡可能地包含更多的頂點(diǎn)。

2.14 強(qiáng)連通圖與強(qiáng)連通分量

有向圖中,若從頂點(diǎn) v v v到頂點(diǎn) w w w有路徑,從頂點(diǎn) w w w到頂點(diǎn) v v v也有路徑,則稱為 v v v和 w w w是強(qiáng)連通的,若該圖中的任意兩個(gè)頂點(diǎn)間都是強(qiáng)連通的,則稱該圖為強(qiáng)連通圖。有向圖中的極大連通子圖稱為強(qiáng)連通分量。

2.15 生成樹、最小生成樹與生成森林

具有 n n n個(gè)頂點(diǎn)的連通圖的極小連通子圖稱為生成樹,生成樹包含這一連通圖的 n n n個(gè)頂點(diǎn)和 n − 1 n-1 n−1條邊。這里的極小是盡可能少地包含邊。

通常把各邊帶權(quán)的連通圖稱為連通網(wǎng),在連通網(wǎng)的所有生成樹中,對(duì)每一棵生成樹的各邊權(quán)值求和,其中權(quán)值最小的生成樹稱為該連通網(wǎng)的最小生成樹。

非連通圖的各連通分量的生成樹組成的森林稱為生成森林。

3. 圖的性質(zhì)

3.1 性質(zhì)1

若圖中有 n n n個(gè)頂點(diǎn) v 1 , v 2 , … , v n v_1,v_2,\dots,v_n v1​,v2​,…,vn​, e e e條邊或弧,其中頂點(diǎn)的度分別為 T D ( v 1 ) , T D ( v 2 ) , … , T D ( v n ) TD(v_1),TD(v_2),\dots,TD(v_n) TD(v1​),TD(v2​),…,TD(vn​),則有
e = 1 2 ∑ i = 1 n T D ( v i ) e=\frac {1} {2} \sum_{i=1} ^ {n} TD(v_i) e=21​i=1∑n​TD(vi​)

3.2 性質(zhì)2

一棵有 n n n個(gè)頂點(diǎn)的生成樹有且僅有 n − 1 n-1 n−1條邊。

4. 圖的存儲(chǔ)結(jié)構(gòu)

4.1 鄰接矩陣

用于無向圖、有向圖

在存儲(chǔ)含有 n n n個(gè)結(jié)點(diǎn)的圖 G = { V , { V R } } G=\{V,\{VR\}\} G={V,{VR}}時(shí),將圖中的所有頂點(diǎn)存儲(chǔ)在長(zhǎng)度為 n n n的一維數(shù)組中,將圖中邊或弧的信息存儲(chǔ)在 n × n n\times n n×n的二維數(shù)組中,我們稱這個(gè)二維的數(shù)組為鄰接矩陣。假設(shè)圖 G G G中頂點(diǎn) v v v和頂點(diǎn) w w w在一維數(shù)組中的下標(biāo)分別為 i i i、 j j j,則該圖對(duì)應(yīng)各鄰接矩陣定義如下:

若該圖為無向圖或有向圖,則
A r c s [ j ] [ j ] = { 1 , ( v , w ) ∈ E 或 v , w > ∈ A 0 , 其 他 Arcs[j][j]=\begin{cases} 1, (v,w)\in E或v,w>\in A\\ \\ 0, 其他 \end{cases} Arcs[j][j]=⎩⎪⎨⎪⎧​1,0,​(v,w)∈E或v,w>∈A其他​  若該圖為無向網(wǎng)或有向網(wǎng),則
A r c s [ j ] [ j ] = { w i j , ( v , w ) ∈ E 或 v , w > ∈ A ∞ , 其 他 Arcs[j][j]=\begin{cases} w_{ij}, (v,w)\in E或v,w>\in A\\ \\ \infty, 其他 \end{cases} Arcs[j][j]=⎩⎪⎨⎪⎧​wij​,∞,​(v,w)∈E或v,w>∈A其他​  其中, w i j w_{ij} wij​為邊或弧對(duì)應(yīng)的權(quán)值。

定義圖中的頂點(diǎn):

class VertexMatrix(object):
    """
    圖的一個(gè)頂點(diǎn)
    """
    def __init__(self, data):
        self.data = data
        self.info = None

定義圖:

class GraphMatrix(object):
    """
    圖的鄰接矩陣
    """
    def __init__(self, kind):
        # 圖的類型: 無向圖, 有向圖, 無向網(wǎng), 有向網(wǎng)
        # kind: Undigraph, Digraph, Undinetwork, Dinetwork,
        self.kind = kind
        # 頂點(diǎn)表
        self.vertexs = []
        # 邊表, 即鄰接矩陣, 是個(gè)二維的
        self.arcs = []
        # 當(dāng)前頂點(diǎn)數(shù)
        self.vexnum = 0
        # 當(dāng)前邊(弧)數(shù)
        self.arcnum = 0

無向圖及其鄰接矩陣、有向網(wǎng)及其鄰接矩陣如下:
A r c s = [ 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 ] A r c s = [ ∞ 1 2 ∞ ∞ ∞ 3 ∞ ∞ ∞ ∞ 4 ∞ ∞ ∞ ∞ ] Arcs=\begin{bmatrix} 0 1 0 1 \\ 1 0 0 1 \\ 0 0 0 1 \\ 1 1 1 0 \end{bmatrix} Arcs=\begin{bmatrix} \infty 1 2 \infty \\ \infty \infty 3 \infty \\ \infty \infty \infty 4 \\ \infty \infty \infty \infty \end{bmatrix} Arcs=⎣⎢⎢⎡​0101​1001​0001​1110​⎦⎥⎥⎤​Arcs=⎣⎢⎢⎡​∞∞∞∞​1∞∞∞​23∞∞​∞∞4∞​⎦⎥⎥⎤

鄰接矩陣的特點(diǎn)如下:

(1) 由于在創(chuàng)建鄰接矩陣時(shí),輸入頂點(diǎn)的順序不同,其相應(yīng)的鄰接矩陣也是不同的;

(2) 對(duì)于含有 n n n個(gè)頂點(diǎn)的圖,其鄰接矩陣一定是 n × n n\times n n×n的二維數(shù)組;

(3) 無向圖的鄰接矩陣具有對(duì)稱性,可采用壓縮存儲(chǔ)的方式存儲(chǔ);

(4) 對(duì)于無向圖,若某一頂點(diǎn) v v v在一維數(shù)組中的下標(biāo)為 i i i,則該頂點(diǎn)的度為鄰接矩陣的第 i + 1 i+1 i+1行中值為1的元素的總數(shù)目;

(5) 對(duì)于有向圖,若某一頂點(diǎn) v v v在一維數(shù)組中的下標(biāo)為 i i i,則該頂點(diǎn)的出度為鄰接矩陣的第 i + 1 i+1 i+1行中值為1的元素的總數(shù)目,入度為鄰接矩陣的第 i + 1 i+1 i+1列中值為1的元素的總數(shù)目。

構(gòu)造一個(gè)具有 n n n個(gè)頂點(diǎn) e e e條邊的無向網(wǎng)的時(shí)間復(fù)雜度為 O ( n 2 + n e ) O(n^2+ne) O(n2+ne),其中對(duì)鄰接矩陣的初始化使用了 O ( n 2 ) O(n^2) O(n2)的時(shí)間。

4.2 鄰接表

用于無向圖、有向圖

使用鄰接表存儲(chǔ)圖時(shí),將圖分為兩個(gè)部分:

第一部分為圖中每一個(gè)頂點(diǎn)及與該頂點(diǎn)相關(guān)聯(lián)的第一條邊或弧,可以這樣定義:

class VertexAdjacencyList(object):
    """
    圖的一個(gè)頂點(diǎn)
    """
    def __init__(self, data):
        self.data = data
        # 與該頂點(diǎn)相連的第一條邊FirstArc
        self.FirstArc = None

使用data域來存儲(chǔ)圖中的每一個(gè)頂點(diǎn),FirstArc域來存儲(chǔ)與該頂點(diǎn)相關(guān)聯(lián)的第一條弧或邊,通常情況下指向第二部分單鏈表的第一個(gè)結(jié)點(diǎn)。

第二部分為用一個(gè)結(jié)點(diǎn)來存儲(chǔ)圖中的每一條邊或弧,該結(jié)點(diǎn)由adjacent域、info域和NextArc域組成,這些結(jié)點(diǎn)形成了單鏈表。這部分結(jié)點(diǎn)可以這樣定義:

class ArcAdjacencyList(object):
    """
    圖的一個(gè)邊(弧)
    """
    def __init__(self, adjacent):
        # 鄰接點(diǎn)或弧頭, 與該頂點(diǎn)相連的另一頂點(diǎn)的index
        self.adjacent = adjacent
        self.info = None
        # 與該邊(弧)依附于相同頂點(diǎn)的下一條邊(弧)NextArc
        self.NextArc = None

根據(jù)上面圖的鄰接表可以這樣定義:

class GraphAdjacencyList(object):
    """
    圖的鄰接表
    """
    def __init__(self, kind):
        # 圖的類型: 無向圖, 有向圖, 無向網(wǎng), 有向網(wǎng)
        # kind: Undigraph, Digraph, Undinetwork, Dinetwork,
        self.kind = kind
        # 鄰接表
        self.vertices = []
        # 當(dāng)前頂點(diǎn)數(shù)
        self.vexnum = 0
        # 當(dāng)前邊(弧)數(shù)
        self.arcnum = 0

無向圖及其鄰接表:


有向網(wǎng)及其鄰接表、逆鄰接表:



鄰接表的特點(diǎn)如下:

(1) 由于存儲(chǔ)邊或弧通過不同的連接順序會(huì)形成不同的單鏈表,所以圖的鄰接表不是唯一的;

(2) 對(duì)于具有 e e e條邊的無向圖,使用鄰接表存儲(chǔ)時(shí)需要 2 e 2e 2e個(gè)結(jié)點(diǎn)來存儲(chǔ)圖的邊,而對(duì)于具有 e e e條弧的有向圖,使用鄰接表存儲(chǔ)時(shí)需要 e e e個(gè)結(jié)點(diǎn)來存儲(chǔ)圖的??;

(3) 對(duì)于具有 n n n個(gè)頂點(diǎn) e e e條邊或弧的稀疏圖而言,若采用鄰接矩陣存儲(chǔ),則需要 n 2 n^2 n2個(gè)存儲(chǔ)空間來存儲(chǔ)圖的邊或弧,而采用鄰接表存儲(chǔ)時(shí),則至多需要 2 e 2e 2e個(gè)結(jié)點(diǎn)存儲(chǔ)圖的邊或弧,所以稀疏圖的存儲(chǔ)使用鄰接表會(huì)更節(jié)省空間;

(4) 對(duì)于無向圖,頂點(diǎn)的度等于該頂點(diǎn)對(duì)應(yīng)的單鏈表中結(jié)點(diǎn)的總數(shù)目;

(5) 對(duì)于有向圖,若某一頂點(diǎn)在數(shù)組中的下標(biāo)為 i i i,則該頂點(diǎn)的出度為該頂點(diǎn)對(duì)應(yīng)的單鏈表中結(jié)點(diǎn)的總數(shù)目,入度為鄰接表中adjacent域內(nèi)值為 i i i的結(jié)點(diǎn)的總數(shù)目。
在使用鄰接表存儲(chǔ)圖時(shí),計(jì)算圖中的某一頂點(diǎn)的出度很容易,但是在計(jì)算其入度時(shí),最壞的情況需要遍歷整個(gè)鄰接表。因此,有時(shí)為了方便計(jì)算頂點(diǎn)的入度,可以為該圖建立一個(gè)逆鄰接表。

在建立鄰接表或逆鄰接表時(shí),如輸入的頂點(diǎn)信息為頂點(diǎn)的編號(hào),則建立鄰接表或逆鄰接表的時(shí)間復(fù)雜度為 O ( n + e ) O(n+e) O(n+e),否則,需要通過查找才能確定頂點(diǎn)在圖中的位置,對(duì)應(yīng)的時(shí)間復(fù)雜度為 O ( n e ) O(ne) O(ne)。

4.3 十字鏈表

用于有向圖

十字鏈表通常用于有向圖,可以將它看成鄰接表和逆鄰接表的結(jié)合。同樣分為兩個(gè)部分,即頂點(diǎn)結(jié)點(diǎn)部分和弧部分,通常將頂結(jié)點(diǎn)存儲(chǔ)在數(shù)組中,弧結(jié)點(diǎn)存儲(chǔ)在單鏈表中。

頂點(diǎn)結(jié)點(diǎn)包含data域、FirstIn域和FirstOut域,其中data域存儲(chǔ)頂點(diǎn)的值,FirstIn域指向以當(dāng)前頂點(diǎn)為弧頭的第

一條弧和FirstOut域指向以當(dāng)前頂點(diǎn)為弧尾的第一條弧。
弧結(jié)點(diǎn)包含TailVertex域、HeadVertex域、HeadLink域、TailLink域和info域,其中TailVertex域存儲(chǔ)當(dāng)前弧的弧尾在數(shù)組中的下標(biāo),HeadVertex域存儲(chǔ)當(dāng)前弧的弧頭在數(shù)組中的下標(biāo),HeadLink域指向與當(dāng)前弧有相同弧頭的下一條弧,TailLink域指向與當(dāng)前弧有相同弧尾的下一條弧,info域存儲(chǔ)當(dāng)前弧的其他信息。

頂點(diǎn)結(jié)點(diǎn)定義如下:

class VertexOrthogonalList(object):
    """
    有向圖的一個(gè)頂點(diǎn)
    """
    def __init__(self, data):
        self.data = data
        # 以該頂點(diǎn)為弧頭的第一條弧FirstIn
        self.FirstIn= None
        # 以該頂點(diǎn)為弧尾的第一條弧FirstOut
        self.FirstOut= None

弧結(jié)點(diǎn)定義如下:

class ArcOrthogonalList(object):
    """
    有向圖的一條弧
    """
    def __init__(self):
        # 當(dāng)前弧中弧頭在數(shù)組中的下標(biāo)HeadVertex
        self.HeadVertex = None
        # 當(dāng)前弧中弧尾在數(shù)組中的下標(biāo)TailVertex
        self.TailVertex = None
        # 與當(dāng)前弧有相同弧頭的下一條弧HeadLink
        self.HeadLink = None
        # 與當(dāng)前弧有相同弧尾的下一條弧TailLink
        self.TailLink = None
        self.info = None

十字鏈表表示的有向圖定義如下:

class GraphOrthogonalList(object):
    """
    有向圖的十字鏈表
    """
    def __init__(self):
        # 十字鏈表
        self.vertices = []
        # 當(dāng)前頂點(diǎn)數(shù)
        self.vexnum = 0
        # 當(dāng)前邊(弧)數(shù)
        self.arcnum = 0

有向圖及其十字鏈表:


4.4 鄰接多重表

用于無向圖

在使用鄰接表存儲(chǔ)無向圖時(shí),圖的每一條邊都對(duì)應(yīng)兩個(gè)結(jié)點(diǎn),由于這兩個(gè)結(jié)點(diǎn)屬于兩個(gè)不同的鄰接表,所以在進(jìn)行刪除操作時(shí)需要對(duì)鄰接表的兩條單鏈表進(jìn)行操作,比較麻煩,所有引出了鄰接多重表。鄰接多重表同樣分為兩個(gè)部分,即頂點(diǎn)結(jié)點(diǎn)和邊結(jié)點(diǎn),通常將頂點(diǎn)結(jié)點(diǎn)存儲(chǔ)在數(shù)組中,邊結(jié)點(diǎn)存儲(chǔ)在單鏈表中。

頂點(diǎn)結(jié)點(diǎn)包含data域和FirstEdge域,其中data域存儲(chǔ)頂點(diǎn)的值,FirstEdge域指向與當(dāng)前頂點(diǎn)相關(guān)聯(lián)的第一條邊。

邊結(jié)點(diǎn)包含mark域、VertexOne域、NextEdgeOne域、VertexTwo域、NextEdgeTwo域和info域,其中mark域用于標(biāo)記當(dāng)前是否被訪問,VertexOne域和VertexTwo域分別存儲(chǔ)當(dāng)前邊的兩個(gè)頂點(diǎn)在數(shù)組中的下標(biāo),NextEdgeOne域指向與VertexOne域?qū)?yīng)的頂點(diǎn)相關(guān)聯(lián)的下一條邊,NextEdgeTwo域指向與VertexTwo域?qū)?yīng)的頂點(diǎn)相關(guān)聯(lián)的下一條邊,info域存儲(chǔ)當(dāng)前邊的其他信息。

頂點(diǎn)結(jié)點(diǎn)定義如下:

class VertexAdjacencyMultitable(object):
    """
    無向圖的一個(gè)頂點(diǎn)
    """
    def __init__(self, data):
        self.data = data
        # 與該頂點(diǎn)相連的第一條邊FirstEdge
        self.FirstEdge = None

邊結(jié)點(diǎn)定義如下:

class Edge(object):
    """
    無向圖的鄰接多重表
    """
    def __init__(self):
        # 用來標(biāo)記當(dāng)前邊是否已被訪問過
        self.mark = None
        # 該邊的兩個(gè)頂點(diǎn)在數(shù)組中的下標(biāo)
        self.VertexOne = None
        self.VertexTwo = None
        # 與VertexOne對(duì)應(yīng)的頂點(diǎn)相連的下一條邊NextEdgeOne
        self.NextEdgeOne = None
        # 與VertexTwo對(duì)應(yīng)的頂點(diǎn)相連的下一條邊NextEdgeTwo
        self.NextEdgeTwo = None
        self.info = None

多重鄰接表表示的圖定義如下:

class GraphAdjacencyMultitable(object):
    """
    無向圖的鄰接多重表
    """
    def __init__(self):
        self.vertices = []
        self.vertexnum = 0
        self.edgenum = 0

無向圖及其鄰接多重鏈表:


到此這篇關(guān)于P-ython數(shù)據(jù)結(jié)構(gòu)之圖的存儲(chǔ)結(jié)構(gòu)詳解的文章就介紹到這了,更多相關(guān)P-ython圖的存儲(chǔ)結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python 數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解
  • python三種數(shù)據(jù)結(jié)構(gòu)及13種創(chuàng)建方法總結(jié)
  • python數(shù)據(jù)結(jié)構(gòu)的排序算法
  • Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)列表與元組示例詳解
  • Python二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct的具體使用
  • python用sqlacodegen根據(jù)已有數(shù)據(jù)庫(kù)(表)結(jié)構(gòu)生成對(duì)應(yīng)SQLAlchemy模型
  • Python數(shù)據(jù)結(jié)構(gòu)之二叉排序樹的定義、查找、插入、構(gòu)造、刪除
  • Python數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列queue用法詳解
  • 詳解python數(shù)據(jù)結(jié)構(gòu)之棧stack
  • Python數(shù)據(jù)結(jié)構(gòu)詳細(xì)

標(biāo)簽:樂山 河南 新疆 沈陽 上海 長(zhǎng)治 紅河 滄州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python數(shù)據(jù)結(jié)構(gòu)之圖的存儲(chǔ)結(jié)構(gòu)詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266