私はperlで書いていますが、アルゴリズムの質問のように思えます。他の言語での返信は大歓迎です。どのように2つの配列の要素間の距離を見つけるには?
私は整数の2つのソート配列、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
がソートさに依存しています:
はここで私が使用しているアルゴリズムです。
は、ここで私は私のアルゴリズムをテストするために書いたサブルーチンです。最初のテストは成功しますが、2番目は失敗:それはないですので、私はそれから1つのを引いた要素のコピーにlong
を比較する場合
$VAR1 = [
7,
5
];
(問題が解決しない:ここ
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);
}
をダンプです。。アルゴリズムlong
より厳密に短くすることshort
を要求するも、私は401、402を変更した場合... 402に、404 ... gotHist
が(7, undef, 5)
なり)
は、ここで私はy'allのから欲しいものです:最初とf oremost、これのための働くアルゴリズム。私が持っているものを修正するか、布全体から別のものを考案する。第二に、私はデバッグのスキルを助けることができます。既存のアルゴリズムの問題を特定するにはどうすればよいでしょうか?私はこの質問をする:)
感謝を必要としないことをやることができれば!
あなたは '$ tarHistを実現します[97] ++ '' @ tarHist'に98個の要素を含むように '' grows、right?なぜハッシュテーブルを使用しないのですか? –
また、 '@tarHist =(@ long + 0);'とは何でしょうか? –