Perl 如何从多个具有多个根的列表中生成父子元素的有序列表?
我最近在这里问了一个问题,得到了一些非常优雅的答案。这是: 拜访 我有一个类似的问题,其中可以有多个根,这意味着有独立的树。下面是一个示例(perl) 在列表列表中,A是B和C的父元素。通常,第一个元素是列表中其余元素的父元素 我想处理这组数组,并生成一个包含正确顺序的列表。在这里,A和Z必须位于其他元素之前(A和Z的顺序并不重要,因为它们是独立的)。以下是两个示例解决方案:Perl 如何从多个具有多个根的列表中生成父子元素的有序列表?,perl,list,parent-child,Perl,List,Parent Child,我最近在这里问了一个问题,得到了一些非常优雅的答案。这是: 拜访 我有一个类似的问题,其中可以有多个根,这意味着有独立的树。下面是一个示例(perl) 在列表列表中,A是B和C的父元素。通常,第一个元素是列表中其余元素的父元素 我想处理这组数组,并生成一个包含正确顺序的列表。在这里,A和Z必须位于其他元素之前(A和Z的顺序并不重要,因为它们是独立的)。以下是两个示例解决方案: (A,Z,B,C,D,E,F,G,H), or (Z,A,B,D,E,F,C,G,H) 重要提示:查看数组编号3;H位
(A,Z,B,C,D,E,F,G,H), or (Z,A,B,D,E,F,C,G,H)
重要提示:查看数组编号3;H位于G之前,尽管它是第四个数组中G的子元素。因此,每个数组中的子元素没有特定的顺序,但在最终结果(如上图所示)中,必须在其子元素/ren之前有任何父元素
这个怎么样?不过,这很直截了当
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;
my@rules=(
[qw(A B C)],
[qw(B D E F)],
[qw(chg)],
[qw(G H)],
[qw(zc)]
);
我的%体重_;
for(@rules){
我的($parent,@children)={$};
$weight_代表{$}++($parent,@children);
$weight_代表{$\u}+=$weight_代表{$parent}
为@儿童;
}
为{$\u0}打印“$\u0=$weight\u\n”
对于排序{$a}的{$weight_,{$b}键的{$weight_,{$b}键的%weight_;
这个怎么样?不过,这很直截了当
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;
my@rules=(
[qw(A B C)],
[qw(B D E F)],
[qw(chg)],
[qw(G H)],
[qw(zc)]
);
我的%体重_;
for(@rules){
我的($parent,@children)={$};
$weight_代表{$}++($parent,@children);
$weight_代表{$\u}+=$weight_代表{$parent}
为@儿童;
}
为{$\u0}打印“$\u0=$weight\u\n”
对于排序{$a}的{$weight_,{$b}键的{$weight_,{$b}键的%weight_;
一个简单的解决方案是找到仅作为第一个元素出现的所有节点(这意味着它们不被任何其他节点引用),并为它们分配一个“假”父节点,如;(X root1 root2..)链接到的代码将查找所有根。有什么问题吗?你的尝试在哪里?@ikegami:我已经解决了我第一次评论中描述的问题,我将很快发布,需要做一些更改。我在寻找数以百万计的开发者心目中的东西:-)一个简单的解决方案是找到所有只作为第一个元素出现的节点(这意味着它们不被任何其他节点引用),并为它们分配一个“假”父节点,如;(X root1 root2..)链接到的代码将查找所有根。有什么问题吗?你的尝试在哪里?@ikegami:我已经解决了我第一次评论中描述的问题,我将很快发布,需要做一些更改。我正在寻找世界上数以百万计的开发者心目中的东西:-)奇妙而简单的解决方案。你介意写一篇关于战略的小描述吗?更多的是从概念的角度,而不是具体的解决方案?谢谢你的时间。如果父母发生在孩子最后一次出现之后,这个解决方案就不起作用了。奇妙而简单的解决方案。你介意写一篇关于战略的小描述吗?更多的是从概念的角度,而不是具体的解决方案?感谢您的时间。如果父项发生在其任何子项最后一次出现之后,则此解决方案不起作用。