圖(Graph)是離散數學中的一種常見數據結構,由節點和邊組成,如果邊有方向,就是有向圖。下圖是一個有4個節點5條邊的有向圖:
這個圖(Graph)可以表示電網、網絡或建築物通道的數學模型。
關聯矩陣
可以通過一個矩陣來解析有向圖,這個矩陣稱為關聯矩陣(Incidence Matrix)。4個節點5條邊的圖用一個5×4的矩陣表示,用正負表示邊的方向,矩陣的一行相當於圖的一條邊,矩陣的一列對應圖的一個節點:
以A的第一行為例,它對應圖的第一條邊e1,e1的方向是從n1指向n2,與n3和n4無關。如果將A中的-1全部改為1,就變成了無向圖。
A的前三行對應了三邊e1,e2,e3,它們構成了圖中的一個回路。對於一個圖來說,回路的數量和位置至關重要。把回路單獨拿出來看:
問題之一是:這三行相互獨立嗎?或者說它們是否是線性無關的?
似乎很容易看出,第3行可以由第1行和第2行相加得到,這說明回路對應的行是線性相關的。從圖上看,從n1到n3可以n1→n3,也可以n1→n2→n3,所以說n1→n3是“多余”的,它可以由“繞行”代替。
存儲大型關聯矩陣
如果用關聯矩陣描述一個大型圖,你會發現矩陣中的0非常多,這個矩陣是一個稀疏矩陣。用計算機存儲這個矩陣時,應當考慮是否應該用鄰接表代替二維數組,同時也可以使用一維數組代替二維數組。
鄰接表是一種常用的數據結構,它是一個存儲了鏈表的一維數組。
還是這個圖,現在不考慮方向,用一維數組描述:
L[4]是有4個節點的數組(假設數組下標從1開始,和Matlab一樣),初始元素都為0,這樣構造數組:
n1與n2聯通,將L[1]與L[2]賦予n2的序號,L = [2,2,0,0];
n2與n3聯通,將L[2]和與L[2]相連的所有節點都賦予n3的序號,L = [3,3,3,0];
n3與n4聯通,將L[3]和與L[4]相連的所有節點都賦予n4的序號,L = [4,4,4,4]。
對於回路不必重新負值:
n1與n4聯通,但是它們之間已經有回路了,L[1] == L[4];
n1與n3聯通,它們之間同樣有回路,L[1] == L[3]。
最終,L = [4,4,4,4],判斷兩點np與nq是否聯通,只需要判斷if L[p] == L[q]即可。
關聯矩陣的零空間
如果A的零空間是零向量,則意味着Ax = 0有唯一解,此時A應當是方陣,A的行最簡階梯矩陣是單位矩陣,A的各列線性無關。
A不是方陣,所以x沒有唯一解。這很容易驗證,Ax = 0中,x有4個分量,方程組中有5個方程,但只有4個未知數,所以方程有無數解。
只要x1 = x2 = x3 = x4,就滿足Ax = 0。A的零空間是位於R4空間下的1維空間:
如果A是電網,xn表示每個節點的電勢,則上面的N(A)意味着所有節點的電勢相等,不存在電勢差,因此不存在電流。如果把n4節點接地,就會產生電勢差,此時相當於將x4的電勢設為0:
對於Ax來說,x4 = 0意味着A的最后一列不起作用(最后一列的各個分量與0的相乘總是0)。這樣,A前三列就變成線性無關,實際上A的任意三列都是線性無關,A的秩是3。
作者:我是8位的