Ich schreibe in Perl, aber es scheint eher wie eine Algorithmusfrage für mich. Antworten in anderen Sprachen sind willkommen.Wie finde ich den Abstand zwischen Elementen zweier Arrays?
Ich habe zwei sortierte Reihen von ganzen Zahlen, short
und long
. Für jedes Element in short
möchte ich das nächste Element in long
finden, und in meinem speziellen Fall möchte ich ein Histogramm der Entfernungen machen.
Hier ist der Algorithmus Ich verwende:
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]++;
}
}
Dies beruht auf short
und long
sortiert werden.
Hier ist ein Unterprogramm, das ich schrieb, um meinen Algorithmus zu testen. Der erste Test erfolgreich ist, aber die zweite nicht:
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);
}
hier ist der dump:
$VAR1 = [
7,
5
];
(das Problem weiterhin besteht, wenn ich long
auf eine Kopie davon minus ein Element vergleichen zu können, so ist es nicht, dass die Algorithmus erfordert short
als long
streng kürzer sein auch, wenn ich 401 ändern, 402 ... bis 402, 404 ... gotHist
wird (7, undef, 5)
)
Hier ist, was ich von y'all möchte:.. zuerst und f Oder ein funktionierender Algorithmus dafür. Entweder repariere das, was ich habe, oder baue ein anderes aus ganzem Stoff. Zweitens könnte ich Hilfe in meinen Debugging-Fähigkeiten verwenden. Wie würden Sie das Problem mit dem vorhandenen Algorithmus identifizieren? Wenn ich das tun könnte, müsste ich diese Frage nicht stellen :)
Danke!
Sie erkennen Sie '$ tarHist [97] ++ 'wächst' @ tarHist' um 98 Elemente zu enthalten, oder? Warum nicht eine Hash-Tabelle verwenden? –
Auch, was ist '@tarHist = (@ lang + 0); soll das tun? –