J'écris en perl, mais cela me semble plus une question d'algorithme. Les réponses dans d'autres langues sont les bienvenues. J'ai deux tableaux triés d'entiers, short
et long
. Pour chaque élément dans short
, je veux trouver l'élément le plus proche dans long
, et dans mon cas particulier je veux faire un histogramme des distances.comment trouver la distance entre les éléments de deux tableaux?
est ici l'algorithme J'utilise:
sub makeDistHist {
my ($hist, $short, $long, $max) = @_; # first 3 are array references
my $lIndex = 0;
foreach my $s (@$short) {
my $distance = abs($s - $long->[$lIndex]);
while (abs($s - $long->[$lIndex+1]) < $distance) {
$distance = abs($s - $long->[$lIndex]);
$lIndex++;
}
$distance = $max if $distance>$max; # make overflow bin
$hist->[$distance]++;
}
}
Cela repose sur short
et long
être triés.
Voici un sous-programme que j'ai écrit pour tester mon algorithme. Le premier test réussit, mais le second échoue:
sub test { # test makeDistHist
my @long = qw(100 200 210 300 350 400 401 402 403 404 405 406);
my @short = qw(3 6 120 190 208 210 300 350);
my @tarHist;
$tarHist[97]++;
$tarHist[94]++;
$tarHist[20]++;
$tarHist[10]++;
$tarHist[2]++;
$tarHist[0]+=3;
my $max = 3030;
my @gotHist;
makeDistHist(\@gotHist, \@short, \@long, $max);
use Test::More tests => 2;
is_deeply(\@gotHist, \@tarHist, "did i get the correct distances for two different arrays?");
@gotHist =();
@tarHist = (@long+0);
makeDistHist(\@gotHist, \@long, \@long, $max);
is_deeply(\@gotHist, \@tarHist, "did i get the correct distances between an array and itself?"); # nope!
print Dumper(\@gotHist);
}
est ici la décharge:
$VAR1 = [
7,
5
];
(le problème persiste, si je compare long
à une copie de celui-ci moins un élément, il est donc pas que la algorithme nécessite short
être strictement inférieure long
aussi, si je change 401, 402 ... 402, 404 ... gotHist
devient (7, undef, 5)
)
Voici ce que je voudrais de vous tous:.. d'abord et F ou plus, un algorithme de travail pour cela. Réparer ce que j'ai ou en concevoir un autre à partir d'un tissu entier. Deuxièmement, je pourrais utiliser l'aide dans mes compétences de débogage. Comment allez-vous identifier le problème avec l'algorithme existant? Si je pouvais faire cela, je n'aurais pas besoin de poser cette question :)
Merci! En ce qui concerne la partie sur le débogage, utilisez un IDE qui permet les points d'arrêt.
Vous vous rendez compte '$ tarHist [97] ++ 'pousse' @ tarHist' pour contenir 98 éléments, non? Pourquoi ne pas utiliser une table de hachage? –
En outre, qu'est-ce que '@tarHist = (@ long + 0);' supposé faire? –