Graph邻接矩阵
在本教程中,您將了解什么是鄰接矩陣。 此外,您還可以在 Python 中找到鄰接矩陣的工作示例。
鄰接矩陣是一種將圖表示為布爾矩陣(0 和 1)的方法。 有限圖可以在計(jì)算機(jī)上以方陣的形式表示,其中矩陣的布爾值表示兩個(gè)頂點(diǎn)之間是否存在直接路徑。
例如,我們有下面的圖表。
我們可以用矩陣形式表示這個(gè)圖,如下所示。
上表/矩陣中的每個(gè)單元格都表示為 AijA_{ij}Aij?,其中 iii 和 jjj 是頂點(diǎn)。 AijA_{ij}Aij? 的值是 1 還是 0,取決于是否存在從頂點(diǎn) iii 到頂點(diǎn) jjj 的邊。
如果存在從 iii 到 jjj 的路徑,則 AijA_{ij}Aij? 的值為 1,否則為 0。例如,從頂點(diǎn) 1 到頂點(diǎn) 2 有一條路徑,因此 A12A_{12}A12? 為 1,并且沒有從頂點(diǎn) 1 到 3 的路徑, 所以 A13A_{13}A13? 為 0。
在無向圖的情況下,矩陣關(guān)于對(duì)角線對(duì)稱,因?yàn)槊織l邊 (i,j)(i,j)(i,j),也有一條邊 (j,i)(j,i)(j,i)。
鄰接矩陣的優(yōu)點(diǎn)
- 添加邊、刪除邊以及檢查是否存在從頂點(diǎn) iii 到頂點(diǎn) jjj 的邊等基本操作是非常省時(shí)的恒定時(shí)間操作。
- 如果圖密集且邊數(shù)很大,則應(yīng)首選鄰接矩陣。 即使圖和鄰接矩陣是稀疏的,我們也可以使用稀疏矩陣的數(shù)據(jù)結(jié)構(gòu)來表示它。
- 然而,最大的優(yōu)勢(shì)來自于矩陣的使用。 硬件的最新進(jìn)展使我們能夠在 GPU 上執(zhí)行甚至昂貴的矩陣運(yùn)算。
- 通過對(duì)鄰接矩陣執(zhí)行操作,我們可以深入了解圖的性質(zhì)及其頂點(diǎn)之間的關(guān)系。
鄰接矩陣的缺點(diǎn)
- 鄰接矩陣的 V×VV \times VV×V 空間要求使其成為內(nèi)存占用者。 圖通常沒有太多的連接,這就是為什么鄰接表是大多數(shù)任務(wù)的更好選擇的主要原因。
- 雖然基本操作很簡(jiǎn)單,但在使用鄰接矩陣表示時(shí),像 inEdges 和 outEdges 這樣的操作代價(jià)高昂。
Python中的鄰接矩陣代碼
# Adjacency Matrix representation in Pythonclass Graph(object):# Initialize the matrixdef __init__(self, size):self.adjMatrix = []for i in range(size):self.adjMatrix.append([0 for i in range(size)])self.size = size# Add edgesdef add_edge(self, v1, v2):if v1 == v2:print("Same vertex %d and %d" % (v1, v2))self.adjMatrix[v1][v2] = 1self.adjMatrix[v2][v1] = 1# Remove edgesdef remove_edge(self, v1, v2):if self.adjMatrix[v1][v2] == 0:print("No edge between %d and %d" % (v1, v2))returnself.adjMatrix[v1][v2] = 0self.adjMatrix[v2][v1] = 0def __len__(self):return self.size# Print the matrixdef print_matrix(self):for row in self.adjMatrix:for val in row:print('{:4}'.format(val)),printdef main():g = Graph(5)g.add_edge(0, 1)g.add_edge(0, 2)g.add_edge(1, 2)g.add_edge(2, 0)g.add_edge(2, 3)g.print_matrix()if __name__ == '__main__':main()鄰接矩陣應(yīng)用
- 在網(wǎng)絡(luò)中創(chuàng)建路由表
- 導(dǎo)航任務(wù)
參考資源
[1] Adjacency Matrix
總結(jié)
- 上一篇: uva 133解题报告
- 下一篇: 深度点评五种常见WiFi搭建方案