加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl依赖树求解器

发布时间:2020-12-16 06:17:59 所属栏目:大数据 来源:网络整理
导读:我正在尝试用一种创造性的方法来确定依赖关系,这样我就可以按正确的顺序启动测试回归. 例如: a: d,e,fb: c,dc: fd: e 这意味着测试“a”取决于测试“d,e和f”等的完成. 我有以下代码将打
我正在尝试用一种创造性的方法来确定依赖关系,这样我就可以按正确的顺序启动测试回归.

例如:

a: d,e,f

b: c,d

c: f

d: e

这意味着测试“a”取决于测试“d,e和f”等的完成.

我有以下代码将打印“叶子”节点“e”和“f”,但我仍然坚持如何遍历和打印父节点.任何提示将非常感谢.

谢谢!

my @input = ("a:d,f","b:c,d","c:f","d:e");
my %Tests = ();
my %Built = ();

## Build Structure
foreach my $elem (@input) {
     my $depends = [];
     my $target;
     ($target,$depends) = parseData($elem);
     $Tests{$target} = $depends; ## Setting array ref to hashkey $target     
}


sub parseData {
  my $data = shift;
  my ($target,$deps) = split(/:/,$data);
  my @deps;
  @deps = split(/,/,$deps);
  return ($target,@deps);
}

foreach my $key (keys %Tests) {
  doIT(%Tests,%Built,$key);
}

sub doIT {
 my ($testRef,$builtRef,$target) = @_;
 my $depends = $testRef->{$target};
 if(exists $builtRef->{$target}) {
   return;
 }
 if(!$depends) {
   ## No dependency,build it
   print "RunTest($target)n";
   $builtRef->{$target}++;
   return;
 }

 foreach my $dep (@$depends) {
    doIT($testRef,$dep);
 }
}

解决方法

总有蛮力的方法.我会让别人想出一些聪明的东西:

use strict;
use warnings;

my @input = ("a:d,"d:e");

my %children;
my %parents;

for (@input) {
    my ($parent,@kids) = split /[:,]/;
    for (@kids) {
        $children{$parent}{$_}++;
        $children{$_} ||= {};
        push @{$parents{$_}},$parent;
    }
}

my @order;
while (my $count = scalar keys %children) {
    while (my ($p,$k) = each %children) {
        if (! keys %$k) {
            push @order,$p;
            delete $children{$p};
            delete $children{$_}{$p} for @{$parents{$p}};
        }
    }

    die "circular dependency exists" if $count == scalar keys %children;
}

print "@order";

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读