tsort
このアルゴリズムを使用して、ライブラリとその依存関係のリストを並べ替えています。依存関係で禁止されていない場合は、並べ替え順序を変更しないでください。これは、このライブラリのリストでは発生しません。
- これ
- それ
- その他[あれ]
- 事[これ]
依存関係は括弧内に指定されています。this
依存関係はありthat
ません。other
に依存しthat
、およびthing
に依存しthat
ますthis
。適用後tsort
、リストを次のように出力したいと思います。
- これ
- それ
- 他の
- もの
注文に変更はありません。代わりに私が得るものは次のとおりです。
- それ
- 他の
- これ
- もの
これは依存関係の解決に関しては正しいですが、元の順序を保持できません。
これが私のコードの簡略化されたバージョンです:
#!/usr/bin/perl -w
use v5.10;
sub sortem {
my %pairs; # all pairs ($l, $r)
my %npred; # number of predecessors
my %succ; # list of successors
for my $lib (@_) {
my $name = $lib->[0];
$pairs{$name} = {};
$npred{$name} += 0;
for my $dep (@{ $lib->[1] }) {
next if exists $pairs{$name}{$dep};
$pairs{$name}{$dep}++;
$npred{$dep}++;
push @{ $succ{$name} } => $dep;
}
}
# create a list of nodes without predecessors
my @list = grep {!$npred{$_}} keys %npred;
my @ret;
while (@list) {
my $lib = pop @list;
unshift @ret => $lib;
foreach my $child (@{$succ{$lib}}) {
push @list, $child unless --$npred{$child};
}
}
if ( my @cycles = grep { $npred{$_} } @_ ) {
die "Cycle detected between changes @cycles\n";
}
return @ret;
}
say for sortem(
['this', []],
['that', []],
['other', [qw(that)]],
['thing', [qw(that this)]],
);
元の順序を可能な限り維持するために、これをどのように変更できますか?
Perlを知らないが、実際に動作することを確認したいだけの場合は、これらの行をファイルに貼り付け、ファイルをフィードしてtsort
、同じ、順序を保持しない出力を取得します。
that thing
this thing
that other
that this