J'essaye d'écrire un algorithme de tri de fusion en Perl et j'ai essayé de copier le pseudo code from Wikipedia.Quel est le problème avec mon implémentation de tri de fusion dans Perl?
Voilà donc ce que j'ai:
sub sort_by_date {
my $self = shift;
my $collection = shift;
print STDERR "\$collection = ";
print STDERR Dumper $collection;
if (@$collection <= 1) {
return $collection;
}
my ($left, $right, $result);
my $middle = (@$collection/2) - 1;
my $x = 0;
for ($x; $x <= $middle; $x++) {
push(@$left,$collection->[$x]);
}
$x = $middle + 1;
for ($x; $x < @$collection; $x++ ) {
push(@$right,$collection->[$x]);
}
$left = $self->sort_by_date($left);
$right = $self->sort_by_date($right);
print STDERR '$left = ';
print STDERR Dumper $left;
print STDERR '$right = ';
print STDERR Dumper $right;
print STDERR '$self->{\'files\'}{$left->[@$left-1]} = ';
print STDERR Dumper $self->{'files'}{$left->[@$left-1]};
print STDERR '$self->{\'files\'}{$right->[0]} = ';
print STDERR Dumper $self->{'files'}{$right->[0]};
if ($self->{'files'}{$left->[@$left-1]}{'modified'} > $self->{'files'}{$right->[0]}{'modified'}) {
$result = $self->merge_sort($left,$right);
}
else {
$result = [ @$left, @$right ];
}
return $result;
}
## We're merge sorting two lists together
sub merge_sort {
my $self = shift;
my $left = shift;
my $right = shift;
my @result;
while (@$left > 0 && @$right > 0) {
if ($self->{'files'}{$left->[0]}{'modified'} <= $self->{'files'}{$right->[0]}{'modified'}) {
push(@result,$left->[0]);
shift(@$left);
}
else {
push(@result,$right->[0]);
shift(@$right);
}
}
print STDERR "\@$left = @$left\n";
print STDERR "\@$right = @$right\n";
if (@$left > 0) {
push(@result,@$left);
}
else {
push(@result,@$right);
}
print STDERR "\@result = @result\n";
return @result;
}
L'erreur que je reçois + la sortie de mes déclarations d'impression de débogage est comme suit:
$collection = $VAR1 = [
'dev/css/test.css',
'dev/scripts/out.tmp',
'dev/scripts/taxonomy.csv',
'dev/scripts/wiki.cgi',
'dev/scripts/wiki.cgi.back',
'dev/templates/convert-wiki.tpl',
'dev/templates/includes/._menu.tpl',
'dev/templates/test.tpl'
];
$collection = $VAR1 = [
'dev/css/test.css',
'dev/scripts/out.tmp',
'dev/scripts/taxonomy.csv',
'dev/scripts/wiki.cgi'
];
$collection = $VAR1 = [
'dev/css/test.css',
'dev/scripts/out.tmp'
];
$collection = $VAR1 = [
'dev/css/test.css'
];
$collection = $VAR1 = [
'dev/scripts/out.tmp'
];
$left = $VAR1 = [
'dev/css/test.css'
];
$right = $VAR1 = [
'dev/scripts/out.tmp'
];
$self->{'files'}{$left->[@$left-1]} = $VAR1 = {
'type' => 'file',
'modified' => '0.764699074074074'
};
$self->{'files'}{$right->[0]} = $VAR1 = {
'type' => 'file',
'modified' => '340.851956018519'
};
$collection = $VAR1 = [
'dev/scripts/taxonomy.csv',
'dev/scripts/wiki.cgi'
];
$collection = $VAR1 = [
'dev/scripts/taxonomy.csv'
];
$collection = $VAR1 = [
'dev/scripts/wiki.cgi'
];
$left = $VAR1 = [
'dev/scripts/taxonomy.csv'
];
$right = $VAR1 = [
'dev/scripts/wiki.cgi'
];
$self->{'files'}{$left->[@$left-1]} = $VAR1 = {
'type' => 'file',
'modified' => '255.836377314815'
};
$self->{'files'}{$right->[0]} = $VAR1 = {
'type' => 'file',
'modified' => '248.799166666667'
};
@ARRAY(0x8226b2c) = dev/scripts/taxonomy.csv
@ARRAY(0x8f95178) =
@result = dev/scripts/wiki.cgi dev/scripts/taxonomy.csv
$left = $VAR1 = [
'dev/css/test.css',
'dev/scripts/out.tmp'
];
$right = $VAR1 = 2;
$self->{'files'}{$left->[@$left-1]} = $VAR1 = {
'type' => 'file',
'modified' => '340.851956018519'
};
$self->{'files'}{$right->[0]} = [Tue Sep 22 13:47:19 2009] [error] [Tue Sep 22 13:47:19 2009] null: Can't use string ("2") as an ARRAY ref while "strict refs" in use at ../lib/Master/ProductVersion.pm line 690.\n
Maintenant, la complexité supplémentaire que vous voyez dans le code est que pour chaque article dans le $ collection array_ref passé il y a aussi une entrée de hachage pour cet élément contenant item => {type => 'fichier', modified => 'date-last-modified'} et je suis essayer de trier la date de dernière modification de chaque fichier.
Mon cerveau ne peut tout simplement pas faire face à la récursivité et je ne peux pas comprendre où je vais mal - c'est probablement évident et/ou terriblement mal. Toute aide serait très appréciée ... ou je réécris en tri d'insertion!
Merci
Fournir les données que vous utilisez pourrait vous aider. –
Quelques questions: (1) Pourquoi ce genre prend-il le '$ self'? (2) Comment les données sont-elles construites dans la structure? (3) Pourquoi votre fonction n'est-elle pas plus modelée sur 'chaque élément du tableau à trier a-t-il toutes les informations nécessaires?' Piquer '$ self' pour trouver l'attribut time d'un item de la collection à trier est ... un peu bizarre. –