1
2
3
4
5
6
7
for( my $i = 0; $i <= @Connections; $i++ )
{
# Berechnung eines Maßes für die Verbindungslänge
my $diff = $Connections[$i][0] - $Connections[$i][1] ;
$diff = $diff * $diff ;
#????
}
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
#! /usr/bin/perl use strict; use warnings; use 5.010; use Data::Dumper; my @array = ( [ 3, 7 ], [ 1, 2 ], [ 2, 4 ], ); # Schwartzian Transform; read it from the end my @sorted = # restore original data map { $_->[0] } # sort numerically by the calculated differemce sort { $a->[1] <=> $b->[1] } # create temp array ref; first element is the original data # second element is the square of the difference between second and first value of original dataset map { [ $_, ($_->[1] - $_->[0])**2 ] } # parse list of array duples @array; say Dumper \@sorted;
my @sorted = sort { ($a->[0]-$a->[1])**2 <=> ($b->[0]-$b->[1])**2 } @Connections;
1
2
3
4
5
6
7
8
9
sub index_by_length {
my $conn_a = $Connections[$a];
my $diff_a = $conn_a->[0] - $conn_a->[1];
my $conn_b = $Connections[$b];
my $diff_b = $conn_b->[0] - $conn_b->[1];
return $diff_a*$diff_a <=> $diff_b*$diff_b;
}
my @sorted_indices = sort index_by_length 0..$#Connections;
1
2
3
my @diffs = map { my $diff = $_->[0]-$_->[1]; $diff*$diff } @Connections;
my @sorted_indices = sort { $diffs[$a] <=> $diffs[$b] } 0..$#Connections;
@SConnections = sort { ($a->[1]-$a->[0]) <=> ($b->[1]-$b->[0]) } @Connections;
2018-04-13T05:39:37 rostiGenau das macht die Schwatrz'sche Transformation nicht. Die Anzahl der Vergleiche beim Sortieren bleibt exakt gleich.Darüber hinausgehend verringert die Schartzsche Transformation die Anzahl der Vergleichsvorgänge.
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
my $cnt_sort = 1; my $cnt_sort_schwartz = 1; my @array = ( [25,1], [3,7], [1,2], [2,4], [2,2], [35,34] ); # Native my @dummy = sort{ helper($a) <=> helper($b) }@array ; # nach Schwartz my @dummy_schwartz = map{$_->[0]} sort{ $a->[1] <=> $b->[1] } map{[$_, helper_schwartz($_)]} @array; print Dumper \@dummy_schwartz; print "Anzahl der Aufrufe cnt_sort: $cnt_sort\n"; print "Anzahl der Aufrufe cnt_sort_schwartz: $cnt_sort_schwartz\n"; sub helper{ my $ref = shift; $cnt_sort++; return abs($ref->[1] - $ref->[0]); } sub helper_schwartz{ my $ref = shift; $cnt_sort_schwartz++; return abs($ref->[1] - $ref->[0]); } Anzahl der Aufrufe cnt_sort: 17 Anzahl der Aufrufe cnt_sort_schwartz: 7
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
my $cnt_sort = 0; my $cnt_sort_schwartz = 0; my $comparison = 0; my @array = ( [25,1], [3,7], [1,2], [2,4], [2,2], [35,34] ); # Native my @dummy = sort{ $comparison++; helper($a) <=> helper($b) }@array ; print "Anzahl der Vergleiche: $comparison\n"; print "Anzahl der Aufrufe cnt_sort: $cnt_sort\n"; # nach Schwartz $comparison = 0; my @dummy_schwartz = map{$_->[0]} sort{ $comparison++; $a->[1] <=> $b->[1] } map{[$_, helper_schwartz($_)]} @array; print "\nAnzahl der Vergleiche: $comparison\n"; print "Anzahl der Aufrufe cnt_sort_schwartz: $cnt_sort_schwartz\n"; sub helper{ my $ref = shift; $cnt_sort++; return abs($ref->[1] - $ref->[0]); } sub helper_schwartz{ my $ref = shift; $cnt_sort_schwartz++; return abs($ref->[1] - $ref->[0]); } __END__ Anzahl der Vergleiche: 8 Anzahl der Aufrufe cnt_sort: 16 Anzahl der Vergleiche: 8 Anzahl der Aufrufe cnt_sort_schwartz: 6
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
my $cnt_sort = 0; my $cnt_sort_schwartz = 0; my $cnt_cmp_sort = 0; my $cnt_cmp_sort_schwartz = 0; my @array = ( [25,1], [3,7], [1,2], [2,4], [2,2], [35,34], ); # Native my @dummy = sort{ $cnt_cmp_sort++; helper($a) <=> helper($b) }@array ; # nach Schwartz my @dummy_schwartz = map{$_->[0]} sort{$cnt_cmp_sort_schwartz++; $a->[1] <=> $b->[1] } map{[$_, helper_schwartz($_)]} @array; print "Anzahl der Helper-Aufrufe cnt_sort: $cnt_sort\n"; print "Anzahl der Helper-Aufrufe cnt_sort_schwartz: $cnt_sort_schwartz\n"; print "Anzahl der Vergleiche cnt_cmp_sort: $cnt_cmp_sort\n"; print "Anzahl der Vergleiche cnt_cmp_sort_schwartz: $cnt_cmp_sort_schwartz\n"; sub helper{ my $ref = shift; $cnt_sort++; return abs($ref->[1] - $ref->[0]); } sub helper_schwartz{ my $ref = shift; $cnt_sort_schwartz++; return abs($ref->[1] - $ref->[0]); }
map{[$_, helper_schwartz($_)]} @array;
2018-04-13T15:16:48 LinuxerSchade, dass Du auf das eigentliche Thema gar nicht mehr eingehst.
"rostiDarüber hinausgehend verringert die Schartzsche Transformation die Anzahl der Vergleichsvorgänge.
clmsGenau das macht die Schwatrz'sche Transformation nicht. Die Anzahl der Vergleiche beim Sortieren bleibt exakt gleich.
rostiKommt darauf an, wie man den Helper einsetzt, z.B. so:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
my @array = ( [1,25], [3,7], [1,2], [2,4], [2,2] ); foreach my $r( sort{ helper($a) <=> helper($b) }@array ){ print Dumper $r; } # Betrag der Differenz berechnen sub helper{ my $ref = shift; return abs($ref->[1] - $ref->[0]); }