【发布时间】:2017-04-03 23:33:06
【问题描述】:
我有一个包含数百万个浮点数(有序)的数组,然后是另一个较小的数组,我需要在一定的公差范围内匹配数字(大数组中的值与小数组)从大数组中的小数组。好吧,没什么大不了的,这是用于在容差范围内返回不完美匹配的 perl 函数,它在 for 循环中,我正在循环遍历小数组值。
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 但它太慢了。
my $min = $val - $t;
my $max = $val + $t;
my @arr2 = grep { ( $_ > $min ) && ($_ < $max ) }@big_arr1;
所以我想稍微修改一下二进制搜索以返回从 $min 到 $max 的范围,因为我认为一旦有一个匹配项是在 $min 或 $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 是的,应该是错字
-
1) 不要发布您实际上没有运行的代码。 2)问题是你寻找范围的结尾,但你从来没有寻找它的开始。
-
@HåkonHægland 大数组从低到高排序,它们是唯一值,而小数组一个数字可以匹配到我认为大约在公差范围内的 20 个值(我有 6 个小数点并且公差有 4 所以我认为 20 是匹配数的一个很好的近似值)。