隣接行列
グラフ理論および計算機科学において、隣接行列(りんせつぎょうれつ、adjacency matrix)は、有限グラフを表わすために使われる正方行列である。この行列の要素は、頂点の対がグラフ中で近傍 (グラフ理論)しているか否かを示す。
有限単純グラフの特別な例では、隣接行列はその対角上に0を持つ 論理行列である。もしグラフが無向ならば、隣接行列は対称である。グラフとその隣接行列の固有値および固有ベクトルとの間の関係はスペクトラルグラフ理論において研究される。
隣接行列はグラフに関する接続行列および次数行列と区別されなければならない。接続行列は、その要素が頂点-辺の対が接続しているか否かを示す行列表現であり、次数行列は個々の頂点の次数に関する情報を含む行列表現である。
頂点の組Vを持つ単純グラフについて、隣接行列はその要素Aijが頂点iから頂点jへの辺が存在する時は1、辺が存在しない時は0であるような V × V正方行列Aである。この行列の対角要素は全て0である(単純グラフでは頂点からそれ自身への辺〈ループ (グラフ理論)〉は許されないため)。また、代数的グラフ理論において代数変数を持つ非ゼロ要素を置換するために有用なこともある。
同じ概念は2つの頂点間の辺の数を対応する行列要素に格納することや非ゼロの対角要素を許容することによって多重グラフやループを持つグラフへと拡張することができる。ループは、一貫した慣習に従っている限り、1回(単一の辺)数えても2回(2つの頂点-辺接続として)数えてもよい。無向グラフはループを2回数える後者の慣習を使用することが多いが、有向グラフは通常前者の慣習を使用する
2つの部分がr個とs個の頂点を持つ2部グラフの隣接グラフAは以下の形式で書くことができる。
A = \begin{pmatrix} 0_{r,r} & B \\ B^T & 0_{s,s} \end{pmatrix},
上式において、Bはr × s 行列、0r,rおよび0s,sはr × rおよびs × sゼロ行列を表わす。この場合、より小さな行列Bがグラフを一意に表わし、Aの残りの部分は冗長として捨てることができる。Bはbiadjacency行列と呼ばれることがある。
形式的に、G = (U, V, E)を部分U = {u1, …, ur}およびV = {v1, …, vs}を持つ2部グラフとする。Biadjacency行列は、 (ui, vj) ∈ Eの時かつその時に限りbi,j = 1のr × s 0–1行列Bである。
Gが2部多重グラフまたは重み付きグラフならば、要素 bi,jは頂点間の辺の数、または辺(ui, vj)の重みをそれぞれ取る。
単純グラフの (a, b, c)-「隣接行列」は、(i, j) が辺ならばAi,j = a、辺でなければb、対角上にcを持つ。 セイデル隣接行列は(−1, 1, 0)-「隣接行列」である。この行列は強正則グラフとツーグラフの研究で使われる。
距離行列は、位置 (i, j) に頂点viと vjとの間の距離を有する。この距離は頂点を連結する最短の道の長さである。辺の長さが明示的に与えられていない限り、道の長さは道中の辺の数である。距離行列は隣接行列の高冪と似ているが、2つの頂点が連結しているかどうか(すなわち、真偽値を含む連結行列)だけを教える代わりに、頂点間の正確な距離を与える。
ここでは(無向グラフについて)、それぞれの辺が行列中の適切なセルに1を加え、それぞれのループが2を加えるという慣習に従う。これによって、隣接行列中のその対応する行または列中の値の和を取るとによって頂点の次数を容易に見付けることが可能である。
有向グラフでは、頂点の入次数は対応する列の成分の和を取ることによって計算でき、出次数は対応する行の成分の和を取ることによって計算できる。
完全グラフの隣接行列は、成分が0の対角要素以外は全て1を含む。空グラフの隣接行列はゼロ行列である。
無向単純グラフの隣接行列は対称であり、したがって実固有値および直交固有ベクトル基底の完全集合を持つ。グラフの固有値一式はグラフのスペクトルである。通常、固有値を\lambda_1\geq \lambda_2\geq \cdots \geq \lambda_nと表わす。
最大固有値\lambda_1は最大次数によって上に有界である。これはペロン=フロベニウスの定理の結果として見ることができるが、容易に証明することができる。vを\lambda_1と関連した1つの固有ベクトルとし、xをvが最大の絶対値を持つ成分とする。一般性を失うことなくvxは正と仮定する。なぜならさもなければ、単純に(これも\lambda_1と関連した)固有ベクトル-vを取ると、
\lambda v_x=(A v)_x=\sum_{y=1}^n A_{x,y}v_y\leq \sum_{y=1}^n A_{x,y} v_x = v_x \deg(x)
となるためである。
d次正則グラフについて、dはベクトルv = (1, …, 1)に対するAの最初の固有値である(これが固有値であり、上界により最大値であることを調べることは簡単である)。この固有値の多重度はGの連結成分の数であり、具体的には連結グラフでは\lambda_1>\lambda_2である。もしGが2部グラフならば、それぞれの固有値\lambda_iについて、その反数 -\lambda_i=\lambda_{n+1-i}もAの固有値であるMarch 2015。具体的には、-dは2部グラフの固有値である。
差\lambda_1-\lambda_2はスペクトルギャップと呼ばれ、Gのエクスパンダーグラフと関連している。また、スペクトルギャップは、\lambda(G) = \max_〔\lambda_i| < d} |\lambda_i|によって示されるAのスペクトル半径を導入するためにも有用である。この数は\lambda(G)\geq 2\sqrt{d-1}-o(1)で境界がある。この境界はラマヌジャングラフにおいてタイトである。ラマヌジャングラフは多くの分野に応用を持つ。
隣接行列A1およびA2を持つ2つの有向または無向グラフG1およびG2が与えられと仮定する。G1およびG2は、
P A_1 P^{-1} = A_2
というような置換行列Pが存在する時かつその時に限り同型である。
具体的には、A1およびA2は相似であり、したがって同一の最小多項式、固有多項式、固有値、行列式、跡を有する。したがってこれらは、グラフの同型不変量として機能する。しかしながら、2つのグラフは同じ固有値の組を持つかもしれないが、同型ではない。こういった線型作用素は等スペクトル的と言われる。
Aが無向または有向グラフGの隣接行列とすると、行列An(すなわちAのn個の複製の積)は興味深い解釈を持つ: 要素(i, j)は頂点iから頂点jへの長さnの(有向または無向)歩道の数を与える。nが、あるi、jについてAnの要素(i, j)が正となるような最小の非負整数とすると、nは頂点iと頂点jとの間の距離である。これは、例えば、無向グラフG中の三角形の数が厳密にA3の跡を6で割った数となることを暗に示す。ここで留意すべきは、隣接行列はグラフが連結しているかどうかを決定するために使うことができることである。
隣接行列は、グラフを操作するためのコンピュータプログラムにおけるグラフの表現のためのデータ構造として使うことができる。この応用のためにも使われる主な代替データ構造は隣接リストである。
隣接行列中の各成分は1ビットしか必要としないため、隣接行列は非常にコンパクトなやり方で表すことができ、有向グラフを表わすためにはわずかV 2/8バイト、無向グラフを表わすためには(パック三角形式を用い、行列の下部三角部分のみを格納することによって)わずか約 V 2/16しか占めない。わずかにより簡潔な表現も可能であるものの、この方法は全てのn頂点グラフを表わすために必要な最小ビット数の情報理論的下界に近付く。テキストファイルにグラフを格納するためには、全てのバイトがテキスト文字であることを(例えばBase64表現を使うことによって)保証するためにバイト毎により少ないビットした使うことができない。無駄な空間を避けることに加えて、このコンパクトさは参照の局所性を促す。しかしながら、大きな密グラフでは、隣接リストのほうが必要とする格納空間が小さい。これは、隣接リストは存在「しない」辺を表わすためのいかなる空間も無駄にしないためである。
隣接行列の別形式(しかし、より大きな空間量を必要とする)は行列の個々の要素中の数を(辺が存在する時は)辺オブジェクトへのポインタあるいは(辺が存在しない時は)ヌルポインタで置き換える。また、辺の重みを隣接行列の要素中に直接格納することも可能である。
空間のトレードオフに加えて、異なるデータ構造は異なる操作をも容易にする。隣接リスト中の任意の頂点に隣接する全ての頂点を探すことはリストを読むのと同じぐらい単純であり、隣の数の比例した時間がかかる。隣接行列を使うと、代わりに全行をスキャンしなければならず、これはグラフ全体の中の頂点の数に比例したより長い時間がかかる。一方、任意の2つの頂点間に辺が存在するかどうかを調べるのは隣接行列を使うと瞬時に決定することができるのに対して、隣接リストを使うと2つの頂点の最小次数に比例した時間を要する。