Thread Distanzmatrix erstellen
(8 answers)
Opened by Perl-Beginner at 2011-10-24 17:32
suchst du so was?:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %HoA = ( root=>['A', 'B'], A=>['C', 'D'], B=>['E', 'F'], C=>['G', 'H'], D=>['I'], G=>['K'], E=>['J'], ); my ($tree,$names)=make_tree(\%HoA,'root'); $tree={'root' => $tree}; print Dumper($tree); my @list=make_list($tree); #print Dumper(\@list); my @nn=@$names; while(my $name=shift(@nn)) { for my $nn (@nn) { my $dist=make_diff(\@list,$name,$nn); print "dist $name <> $nn => $dist\n"; } } ######################################################################## sub make_tree { my $data=shift; my $node=shift; return '',[$node] unless(exists($data->{$node})); my $ref={}; my @names=($node); for my $name (@{$data->{$node}}) { my $nn; ($ref->{$name},$nn)=make_tree($data,$name); push(@names,@$nn); } return $ref,\@names; } sub make_list { my $tree=shift; my @lst; for my $node (keys(%$tree)) { push(@lst,[$node]); if(ref($tree->{$node})) { my @ret=make_list($tree->{$node}); push(@lst,[$node,@$_]) for(@ret); } } return @lst; } sub make_diff { my $list=shift; my $name1=shift; my $name2=shift; my $l1; my $l2; for my $elm (@list) { $l1=$elm if($elm->[-1] eq $name1); $l2=$elm if($elm->[-1] eq $name2); last if($1 and $l2); } return -1 if(!$l1 or !$l2); my $size=$#$l1+$#$l2+1; my $p=0; while($p<$#$l1 and $p<$#$l2) { if($l1->[$p] eq $l2->[$p]) { $size-=2; } else { last; } $p++; } $size-- if($p==$#$l1 || $p==$#$l2); return $size; } Ausgabe: Code: (dl
)
1 $VAR1 = { |