外部メモリグラフ走査は、外部に保存されたメモリへのアクセスに最適化されたグラフ走査の一種です。
グラフ走査は、ほとんどのグラフアルゴリズムにおけるサブルーチンです。グラフ走査アルゴリズムの目的は、グラフのすべてのノードを訪問(および/または処理)することです。幅優先探索や深さ優先探索などのグラフ走査アルゴリズムは、均一なメモリアクセスコストを仮定したフォン・ノイマンモデルを用いて分析されます。しかし、このモデルでは、大規模なインスタンスではグラフの一部が内部メモリではなくディスク上に存在するという事実が考慮されていません。ディスクへのアクセスは内部メモリへのアクセスよりもはるかに遅いため、外部メモリを効率的に走査する必要性が生じます。
外部メモリアルゴリズムの解析には、AggarwalとVitterによる外部メモリモデル[ 1 ]が使用されます。マシンは、M、B、Dの3つのパラメータで指定されます。M は内部メモリのサイズ、Bはディスクのブロックサイズ、Dは並列ディスクの数です。外部メモリアルゴリズムのパフォーマンスの尺度は、実行されるI/Oの数です。
幅優先探索アルゴリズムは、ルートノードから開始し、深さ1のすべてのノードを走査します。現在の深さで未訪問のノードがなくなったら、より深い深さのノードを走査します。最終的に、グラフのすべてのノードが訪問されます。

無向グラフの場合ムナガラとラナデ[ 2 ]は、 以下の外部メモリアルゴリズムを提案した。
させて幅優先探索レベル t のノードを表し、レベル t-1 の近傍の多重集合とする。すべての t について、から構築できますそれを集合に変換し、以前に訪れたノードを除外することによって。
このアルゴリズムの入出力の総数は、以下の点を考慮すると次のようになる。そしてそしてそれは。
L ( t )を計算するために必要な、説明した3つのステップを視覚化した図が右の図に示されています。
MehlhornとMeyer [ 3 ]は、MunagalaとRanade(MR)のアルゴリズムに基づいて、その結果を改善するアルゴリズムを提案した。
これは2つのフェーズから構成されます。第1フェーズではグラフの前処理を行い、第2フェーズでは第1フェーズで収集した情報を用いて幅優先探索を実行します。
前処理段階では、グラフは互いに素な部分グラフに分割されます。小径で、さらに外部ファイルを構築することで隣接リストを適切に分割します。、 どこすべてのノードの隣接リストが含まれています。
幅優先探索フェーズはMRアルゴリズムと同様です。さらに、このアルゴリズムはソートされた外部ファイルHを保持します。このファイルは次のように初期化されます。さらに、作成された幅優先探索レベルのノードには、ファイルの識別子が含まれています。それぞれのサブグラフのランダムアクセスを使用して構築する代わりにファイルHが使用されます。
Hではエッジのスキャン頻度が高くなる可能性があるが、隣接リストを取得するための非構造化I/Oは削減される。
このアルゴリズムの入出力の総数は
深さ優先探索アルゴリズムは、バックトレースを行う前に、各枝に沿って可能な限り深くグラフを探索します。
有向グラフの場合、Buchsbaum、Goldwasser、Venkatasubramanian、Westbrook [ 4 ]は、入出力。
このアルゴリズムは、バッファ付きリポジトリツリー(BRT)と呼ばれるデータ構造に基づいています。これは、順序付けられたユニバースから複数のアイテムのセットを格納します。アイテムはキーによって識別されます。BTRは、次の2つの操作を提供します。
insert(T, x)これは、項目xをTに追加し、償却された入出金。NはBTRに追加された項目の数です。extract(T, k)これは、キーkを持つすべての項目をTから報告および削除します。I/Os、ここでSはextractによって返されるセットのサイズです。このアルゴリズムは、内部の深さ優先探索アルゴリズムをシミュレートします。ノードのスタックSが保持されます。Sの先頭にあるノードvの反復処理中に、未訪問の隣接ノードをSにプッシュして反復処理を行います。未訪問の隣接ノードがない場合は、vをポップします。
難しいのは、ノードが未訪問かどうかを、エッジごとのI/O。ノードvの入力エッジに対してこれを行うには、vが最初に発見されたとき、それらはBRT Dに入れられます。さらに、出力エッジ( v , x )は、隣接リストのランクをキーとする優先度キューP ( v )に入れられます
Sの頂点uに対して、すべてのエッジ ( u , x ) がDから抽出されます。このようなエッジは、u が最後にSの頂点にあったとき以降 (または、 uがSの頂点に初めてある場合はアルゴリズムの開始以降) にx が発見された場合にのみ存在します。すべてのエッジ ( u , x )に対して、 P ( u )に対して delete( x ) 操作が実行されます。最後に、に対してdelete-min 操作が実行されます。 は、次に訪問されていないノードを返します。P( u ) が空の場合、 uはSからポップされます。
このアルゴリズムの擬似コードを以下に示します。
1 手順BGVW-depth-first-search( G , v ): 2. Sをスタック、P []を各ノードの優先度付きキュー、DをBRTとする。 3 S.push ( v ) 4 Sが空でない間 : 5 v := S.top () 6 vがマークされていない場合 : 7点( v ) 8 Dからすべてのエッジ(v, x)を抽出します。∀ x : P [ v ] .delete( x ) 9 if ( u := P [ v ].delete-min()) is not null: 10 S.push ( u ) 11 その他: 12 S .pop() 13 手順マーク( v ) 14 すべてのエッジ ( x、v )をDに入れる 15 ∀ ( v、x ): xをP [ v ]に入れる