4.3.5.1. トポロジカルソート

UP


4.3.5.1. トポロジカルソート

トポロジカルソートは、 S_Cの中にあるクラスをCとしたとき、 Cではない他のクラスがR内で対応する要素に先行するものが無いような クラスCを検索する処理によって行われます。 クラスCは結果の最初に配置されます。 S_CからCを削除し、 DS_Cに含まれるもののとき(C,D)の全てのペアを削除します。 この処理を繰り返し、 結果の最後の、先行するものがないものとしてクラスを追加します。 先行するものを持たない要素が見つからなかったときに停止します。

もしS_Cが空でないときに処理が停止したら、集合Rには矛盾があります。 もし有限のクラスの集合である全てのクラスが 他のものによって先行されていたら、Rにはループが含まれています。 つまり、クラスC1,...,Cnの繋がりに対して、 CiCi+1ただし1<=i<nに先行し、CnC1に先行しています。

ときにはS_Cに先行するものがないクラスが存在することがあります。 このような場合は、これまでに計算されたクラス優先順位リストで もっとも右にあるダイレクトスーパークラスを持つものを選択します (そのような候補クラスがないときはRは部分順序を生成できず、 CS_Cに含まれるときのR_Cは矛盾しています)。

より正確な言葉であらわすと、 {N1,...,Nm}, m>=2S_Cに先行するものがないクラスとします。 (C1,...,Cn), n>=1をこれまでに構築したクラス優先順位リストとします。 C1はもっとも特定的なクラスであり、 Cnはもっとも特定的ではないクラスです。 ここで1<-j<=nのもっとも大きな数

1<=j<=nを、1<=i<=mNiCjのダイレクトスーパークラスである iが存在するような最大の数とします。 このときNiは次に配置されるものになります。

先行するものがないクラスの集合から選択するというこのルールの効果は、 単純なスーパークラスのつながりであるクラスが クラス優先順位リストで隣接しており、 相対的に分離した各サブグラフのクラスが クラス優先順位リストで隣接するようになります。 例えば、T1T2をクラスJのみを共通要素とするサブグラフとします。 JのスーパークラスはT1T2のいずれにも現れず、 JT1T2の両方のクラスのスーパークラス内にあるとします。 T1の底をC1とし、 T2の底をC2とします。 あるクラスのダイレクトスーパークラスにC1,C2という順番で 現れているようなクラスをCとしたとき、 Cのクラス優先順位リストはCで始まり、 T1Jを除くすべてのクラスが続きます。 クラスT2のすべてのクラスが次に続きます。 クラスJとそのスーパークラスは最後に現れます。


TOP, Github