プログラミング言語論の最近のブログ記事

ソートと言えば、クイックソートやマージソートなどが有名だが、トポロジカルソートというソートがある。
だが、このソートは、前述したクイックソートなどの与えられた数列を昇順(降順)に並び替えるものではない。

じゃぁ、トポロジカルソートって何だ??ってというと、
ある有向グラフが与えられた時に、矢印(アーク)の向きと大小関係が一致するように、それぞれ異なった整数をノードに割り当てることである(らしい


例えば、左のような有向グラフが与えられたなら、矢印の先のノードの方が大きくなるように数字を振っていくと
右のようになる

t1.gift2.gif  















ここで、矢印の向きと大小関係が一致するということから、双方向の矢印は存在してはいけない。

また、グラフに閉路(循環)が存在してもいけない。それは下のグラフを見れば分かると思うが、このグラフにトポロジカルソートを行うのは不可能だ。
下の状態では、3→1のところで、条件を満たしていない
t3.gif













で、これをどういうアルゴリズムで出来てるのかというと・・・


あー、もうメンドクサイからレポートのコピペ

下のようなメソッドを書いて、for文でこのメソッドの引数を変えながら順番に呼び出していけばよい







最後に、せっかくレポートで書いたので外部仕様を

【visitメソッドの外部仕様】
閉路検出機能付きのトポロジカルソートを行う。
トポロジカルソートとは、ある有向グラフが与えられた時に、矢印(アーク)の向きと大小関係が一致するように、それぞれ異なった整数をノードに割り当てることである。

○入力
・iは現在いるノードの位置
・nはノードの数

○出力
・jは、ノードを順番に調べる際のカウンタ
・vは、ノードiからアークのあるノードを保持する一時変数
・adjacentは、あるノードから別のノードへのアーク(矢印)が存在するかを示す2次元配列。アークは一方方向のみであるので、adjacent[i][j]==CONNECTEDである場合、adjacent[j][i]は常にUNCONNECTEDでなければならない。また、adjacent[i][i]は常にUNCONNECTEDである。
・visited、そのノードは訪問済みか、訪問中か、まだ訪問していないかを示す配列
・resultは、そのノードにおいて、トポロジカルソートの結果割り当てられた、トポロジカルソート値を示す保持する配列。また、resultの各要素はゼロから始まる自然数のいずれかで、数値が飛ぶことも重複することもない。
・    戻り値は、与えられた有向グラフから閉路が検出できればfalse、そうでなければtrue


このアーカイブについて

このページには、過去に書かれたブログ記事のうちプログラミング言語論カテゴリに属しているものが含まれています。

前のカテゴリはプログラミングCです。

次のカテゴリはリファクタリングです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 5.0