Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何从多个具有多个根的列表中生成父子元素的有序列表?_Perl_List_Parent Child - Fatal编程技术网

Perl 如何从多个具有多个根的列表中生成父子元素的有序列表?

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位

我最近在这里问了一个问题,得到了一些非常优雅的答案。这是:

拜访

我有一个类似的问题,其中可以有多个根,这意味着有独立的树。下面是一个示例(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位于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:我已经解决了我第一次评论中描述的问题,我将很快发布,需要做一些更改。我正在寻找世界上数以百万计的开发者心目中的东西:-)奇妙而简单的解决方案。你介意写一篇关于战略的小描述吗?更多的是从概念的角度,而不是具体的解决方案?谢谢你的时间。如果父母发生在孩子最后一次出现之后,这个解决方案就不起作用了。奇妙而简单的解决方案。你介意写一篇关于战略的小描述吗?更多的是从概念的角度,而不是具体的解决方案?感谢您的时间。如果父项发生在其任何子项最后一次出现之后,则此解决方案不起作用。