Я пишу в perl, но мне кажется, что это вопрос алгоритма. Ответы на другие языки приветствуются.Как найти расстояние между элементами двух массивов?
У меня есть два отсортированных массива целых чисел, short
и long
. Для каждого элемента в short
я хочу найти ближайший элемент в long
, и в моем конкретном случае я хочу сделать гистограмму расстояний.
Вот алгоритм я использую:
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]++;
}
}
Это зависит от short
и long
сортируется.
Вот подпрограмма, которую я написал для проверки моего алгоритма. Первый тест успешно, но второй не удается:
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);
}
вот свалка:
$VAR1 = [
7,
5
];
(проблема сохраняется, если я сравниваю long
к его копии минус один элемент, так что это не то, что алгоритм требует short
быть строго короче long
также, если я изменю 401, 402 ... до 402, 404 ... gotHist
становится (7, undef, 5)
)
Вот что я хотел бы от y'all:.. первый и е oremost, рабочий алгоритм для этого. Либо исправьте то, что у меня есть, либо придумайте другое из цельной ткани. Во-вторых, я мог бы использовать помощь в своих навыках отладки. Как бы вы определили проблему с существующим алгоритмом? Если бы я мог это сделать, мне бы не пришлось задавать этот вопрос :)
Спасибо!
Вы понимаете, `$ tarHist [97] ++ `растет` @ tarHist`, чтобы содержать 98 элементов, правильно? Почему бы не использовать хеш-таблицу? – 2010-12-08 20:16:53