私はフローティングのmilionsとつのアレイを持っている番号(順序付け)し、別の小さい方を指し、iは値の間に重なりが大きいに存在しない(一定の許容範囲内の番号と一致する必要があります配列と小さな配列の値)を大きな配列の小さな配列から削除します。大したことではありません。これは許容範囲内で完璧でない一致を返すためのperl関数です。それはforループ内にあります。小さな配列値をループしています。アルゴリズムバイナリサーチリターン範囲のPerl
sub bin_search{
my ($arr, $v, $t) = @_;
my ($min, $max) = (0, @$arr-1);
while ($min <= $max) {
my $w = $v + $t;
my $k = $v - $t;
my $try = int(($min + $max)/2);
$min = $try + 1, next if $arr -> [$try] < $k ;
$max = $try - 1, next if $arr -> [$try] > $w ;
return $arr -> [$try] ;
}
return 0;
}
しかし、私のデータをチェックインした後、ちょうど最初のマッチを返すので、いくつかの値が破棄されているようです。 私はgrepを試みましたが、遅すぎます。私は1試合があり、一度考えたので
my $min = $val - $t;
my $max = $val + $t;
my @arr2 = grep { ($_ > $min) && ($_ < $max) }@big_arr1;
はので、私は、$分$ maxの範囲を返すためのバイナリ検索を少し変更したかったのいずれかである$分または$ maxの時、そう
のようなものsub bin_search{
my ($arr, $v, $t) = @_;
my ($min, $max) = (0, @$arr-1);
my $w = $v + $t;
my $k = $v - $t;
while ($min <= $max) {
my $try = int(($min + $max)/2);
$min = $try + 1, next if $arr -> [$try] < $k ;
$max = $try - 1, next if $arr -> [$try] > $w ;
last;
}
my @fin;
if (($arr -> [$try] < $w) && ($arr -> [$try] > $k)) {
push @fin, $arr ->[$try]; $try++ }
return \@fin;
}
でも値が不足していますが、私は何か不足していると思います。私たちが下限に達するまで左のようにしてから$ tryに戻り、上限まで同じことをしますか?バイナリ検索を使用して、一致する要素のインデックスを見つけることによって
したがって、小さな配列の数字は大きな配列のサーバー番号と一致しますか?大きな配列の数字は昇順にソートされますが、必ずしも一意ではありませんか? –
あなたは 'push @ fin 'を呼び出すことができます。 – ikegami
@ikegamiええ、それは間違っているはずです。 –