2012-05-03 13 views
1

私は最近ここに質問をし、非常にエレガントな答えを得ました。ここでは、次のとおりです。複数のリストから複数の親子要素の順序付きリストを生成するにはどうすればよいですか?

ログインHow to generate an ordered list of parent-child elements from multiple lists?

私はここで別の木があることを意味重根、そこにすることができ、同様の問題を抱えています。以下はperlの例です。リスト@rulesのリストで

my @rules = (
    [ qw(A B C) ], 
    [ qw(B D E) ], 
    [ qw(C H G) ], 
    [ qw(G H ) ], 
    [ qw(Z C ) ] 
); 

、Aは、最初の要素は、リスト内の要素の残りの親であり、一般的にBおよびCの親です。

この一連の配列を処理し、正しい順序を含むリストを生成したいと考えています。ここでAとZは他の要素の前に来なければなりません(AとZの順序は独立しているので重要ではありません)。ここでは、2つの例のソリューションは、以下のとおりです。

(A,Z,B,C,D,E,F,G,H), or (Z,A,B,D,E,F,C,G,H) 

重要:配列番号3でルック。 Hは4番目の配列のGの子ですが、Gの前に来ます。したがって、各配列には子どもの特定の順序はありませんが、最後の結果(上に示されているように)には、子/レンになる前に親を持つ必要があります。

Here, A, and H are independent of each other, but use common nodes.

+1

一つ簡単な解決策は、(それらが他のノードによって参照されないことを意味する)最初の要素としてのみ発生するすべてのノードを探し、すべての「偽」は、親、等割り当てることであろう。 (X root1 root2 ..) – Moni

+0

リンク先のコードは、すべてのルートを見つけます。どうしたの?あなたの試みはどこですか? – ikegami

+0

@ikegami:最初のコメントでこの方法で説明した問題を既に解決しており、すぐに投稿し、変更を加える必要があります。私は数百万の開発者の世界が何を持っているかを探しています:-) – Moni

答えて

1

これはいかがですか?しかし、それはかなり簡単です。

my @rules = (
    [ qw(A B C) ], 
    [ qw(B D E F) ], 
    [ qw(C H G) ], 
    [ qw(G H ) ], 
    [ qw(Z C ) ] 
); 

my %weight_for; 
for (@rules) { 
    my ($parent, @children) = @{$_}; 
    $weight_for{$_}++ for ($parent, @children); 
    $weight_for{$_} += $weight_for{$parent} 
    for @children; 
} 

print "$_ = $weight_for{$_}\n" 
    for sort { $weight_for{$a} <=> $weight_for{$b} } keys %weight_for; 
+0

素晴らしいと簡単な解決策。この具体的な解決策よりもコンセプトの観点から戦略の小さな記述を書いてもいいですか?お返事ありがとうございます。 – Moni

+0

あなたの解決策の編集を確認してください – Moni

+0

親がその子の最後の出現の後に発生した場合、この解決法は機能しません。 – Moni

関連する問題