我有一个函数,binary_range_search
,被称为像这样:如何延长二进制搜索迭代器消耗多目标
my $brs_iterator = binary_range_search(
target => $range, # eg. [1, 200]
search => $ranges # eg. [ {start => 1, end => 1000},
); # {start => 500, end => 1500} ]
brs_iterator->()
将遍历上$范围重叠的所有@ $范围。
我谨向binary_range_search
能够与多个范围为目标,例如把它称为:
target => $target_ranges # eg. [ [1, 200], [50, 300], ... ]
search => $search_ranges # as above
所以,当在$范围内搜索 - > [0]耗尽时,它应该移至$ range - > [1],依此类推。这是有问题的功能,原来的形式:
sub binary_range_search {
my %options = @_;
my $range = $options{target} || return;
my $ranges = $options{search} || return;
my ($low, $high) = (0, @{$ranges} - 1);
while ($low <= $high) {
my $try = int(($low + $high)/2);
$low = $try + 1, next if $ranges->[$try]{end} < $range->[0];
$high = $try - 1, next if $ranges->[$try]{start} > $range->[1];
my ($down, $up) = ($try) x 2;
my %seen =();
my $brs_iterator = sub {
if ( $ranges->[ $up + 1 ]{end} >= $range->[0]
and $ranges->[ $up + 1 ]{start} <= $range->[1]
and !exists $seen{ $up + 1 })
{
$seen{ $up + 1 } = undef;
return $ranges->[ ++$up ];
}
elsif ($ranges->[ $down - 1 ]{end} >= $range->[0]
and $ranges->[ $down + 1 ]{start} <= $range->[1]
and !exists $seen{ $down - 1 }
and $down > 0)
{
$seen{ $down - 1 } = undef;
return $ranges->[ --$down ];
}
elsif (!exists $seen{$try}) {
$seen{$try} = undef;
return $ranges->[$try];
}
else {
return;
}
};
return $brs_iterator;
}
return sub { };
}
这是一个标准的二分法搜索策略,直到它找到一个重叠的范围。然后它向右移动,耗尽它,向左移动,耗尽它,最后放弃。理想情况下,它应该可能是下一个目标范围,然后重新搜索,我想(可能是通过递归?)。我的问题是,我不确定如何使用迭代器构建工作。
这几乎是完美的;我从来没有想过将迭代器推入堆栈。不过,这个函数返回的迭代器被用作累加器函数的输入。当然,我可以改变累加器重用多个迭代器。谢谢!。 – 2010-01-12 21:28:59