2017-06-06 5 views
0

私は一意のデータのセットを持っています。 XとZにBCDおよびEにdomainA.orgに関連するデータとdoimanY.orgをコピーするために並べ替え特定のオブジェクトのみが同等である場合に設定します

0: domainA.org -> domainB.org 
1: domainY.org -> domainZ.org 
2: domainB.org -> domainC.org 
3: domainD.org -> domainE.org 
4: domainX.org -> domainY.org 
5: domainC.org -> domainD.org 

、私は次の順序でこのセットを反復処理する必要があります:それは次のようになりましょう

0: domainA.org -> domainB.org 
2: domainB.org -> domainC.org 
5: domainC.org -> domainD.org 
3: domainD.org -> domainE.org 

4: domainX.org -> domainY.org 
1: domainY.org -> domainZ.org 

X -> Y -> ZA -> B -> C -> D -> Eより前に処理されるかどうかは関係ありません。

それぞれの「カテゴリ」を並べ替える。独立したデータはすべて独自のものです。 sourceDomain -> destinationDomainのラッパーオブジェクトをComparableを実装し、ソートセットを使ってソートを行いました。 ここに問題があります。
これは以下のように私のcomparteToの実装が見えるものです:彼らは最終リストに隣接している場合にのみ、2つのオブジェクトを比較することである

if (source.equals(other.destination)) { 
    return 1; 
} else if (destination.equals(other.source)) { 
    return -1; 
} 
return 0; 

はそれと同じように「お菓子」他のオブジェクトをotherwhise。
(たとえcompareToが何らかの点で0を返した場合、TreeSet自体に項目を追加していないことは言うまでもありません) これは、例1で示したデータを正しくソートしていないためです。
私のアイデアは、ソースセットを反復して、他のすべてのエントリに対してエントリを比較し、並べ替えが完了したら一緒に参加できる別々のセットを作成することです。
これの複雑さは少なくともn^2になりますが、これはかなり悪いことです。
私の質問:私たちはそれ以上のことはできますか?

+0

何についてソースが等しくない他のデスティネーションも宛先が等しくない他のソース?この場合、メソッドは0を返します –

+0

正しいです、これは問題です...これらの2つのオブジェクトが互いにどのように関連しているかを判断する方法はありません – RoiEX

答えて

2

あなたが探しているものは、グラフのトポロジカルなソートです。これを解決するさまざまなアルゴリズムがあります。the Wikipedia articleの擬似コードで利用できます。

実装するのが最も簡単にはやや下にコピーされた、深さ優先検索です:

L ← Empty list that will contain the sorted nodes 
foreach node n do 
    if not marked n then visit(n) 

function visit(node n) 
    if n has a temporary mark then stop (cyclic dependency found!) 
    if n is not marked (i.e. has not been visited yet) then 
     mark n temporarily 
    for each node m with an edge from n to m do 
     visit(m) 
     mark n permanently 
     unmark n temporarily 
     add n to head of L 

これは、ほとんどの時間計算量O(ノード+エッジ)であり、そしてあなたのケースでは、それはそれは、ノード=思われますエッジは十分に速いでしょう。

関連する問題