Algorithm::BinarySearch::Vec - binary search functions for vec-vectors with fast XS implementations |
Algorithm::BinarySearch::Vec - binary search functions for vec()-vectors with fast XS implementations
use Algorithm::BinarySearch::Vec; ##------------------------------------------------------------- ## Constants my $NOKEY = $Algorithm::BinarySearch::Vec::KEY_NOT_FOUND; my $is_fast = $Algorithm::BinarySearch::Vec::HAVE_XS; ##------------------------------------------------------------- ## Search: element-wise $index = vbsearch ($v,$key,$nbits,$lo,$hi); ##-- match only $index = vbsearch_lb($v,$key,$nbits,$lo,$hi); ##-- lower bound $index = vbsearch_ub($v,$key,$nbits,$lo,$hi); ##-- upper bound ##------------------------------------------------------------- ## Search: array-wise $indices = vabsearch ($v,\@keys,$nbits,$lo,$hi); ##-- match only $indices = vabsearch_lb($v,\@keys,$nbits,$lo,$hi); ##-- lower bound $indices = vabsearch_ub($v,\@keys,$nbits,$lo,$hi); ##-- upper bound ##------------------------------------------------------------- ## Search: vector-wise $ixvec = vvbsearch ($v,$keyvec,$nbits,$lo,$hi); ##-- match only $ixvec = vvbsearch_lb($v,$keyvec,$nbits,$lo,$hi); ##-- lower bound $ixvec = vvbsearch_ub($v,$keyvec,$nbits,$lo,$hi); ##-- upper bound ##------------------------------------------------------------- ## Debugging $val = vget($vec,$i,$nbits); undef = vset($vec,$i,$nbits, $newval); $vals = vec2array($vec,$nbits);
The Algorithm::BinarySearch::Vec perl module provides binary search functions for vec()-vectors, including fast XS implementations in the package Algorithm::BinarySearch::Vec::XS. The XS implementations are used by default if available, otherwise pure-perl fallbacks are provided. You can check whether the XS implementations are available on your system by examining the boolean scalar $Algorithm::BinarySearch::Vec::HAVE_XS.
This module support the following export tags:
vbsearch($v,$key,$nbits,?$ilo,?$ihi)
vec($v,$i,$nbits)==$key
,
with ($ilo <= $i < $ihi)),
or $KEY_NOT_FOUND if no such element exists.
vbsearch_lb($v,$key,$nbits,?$ilo,?$ihi)
Returns the maximum index $i such that
vec($v,$i,$nbits) <= $key
and
vec($v,$j,$nbits) < $key
for all $j with $ilo <= $j < $i,
or $KEY_NOT_FOUND if no such $i exists (i.e. if vec($v,$ilo,$nbits) > $key
).
In other words,
returns the least index of a match for $key in $v whenever a match exists,
otherwise the greatest index whose value in $v is strictly less than $key if that exists,
and $KEY_NOT_FOUND if all values in $v are strictly greater than $key.
This is equivalent to (but usually much faster than):
return $KEY_NOT_FOUND if (vec($v,$ilo,$nbits) > $key); for (my $i=$ilo; $i < $ihi; $i++) { return $i if (vec($v,$i,$nbits) == $key); return $i-1 if (vec($v,$i,$nbits) > $key); } return ($ihi-1);
Note that the semantics of this function differ substantially from the C++ STL function lower_bound().
vbsearch_ub($v,$key,$nbits,?$ilo,?$ihi)
Returns the minimum index $i such that
vec($v,$i,$nbits) >= $key
and
vec($v,$j,$nbits) > $key
for all $j with $i < $j < $ihi,
or $KEY_NOT_FOUND if no such $i exists (i.e. if vec($v,$ihi-1,$nbits) < $key
).
In other words,
returns the greatest index of a match for $key in $v whenever a match exists,
otherwise the least index whose value in $v is strictly greater than $key if that exists,
and $KEY_NOT_FOUND if all values in $v are strictly less than $key.
This is equivalent to (but usually much faster than):
return $KEY_NOT_FOUND if (vec($v,$ihi-1,$nbits) < $key); for ($i=$ihi-1; $i >= 0; $i--) { return $i if (vec($v,$i,$nbits) == $key) return $i+1 if (vec($v,$i,$nbits) < $key) } return $ilo;
Note that the semantics of this function differ substantially from the C++ STL function upper_bound().
vabsearch($v,\@keys,$nbits,?$ilo,?$ihi)
$indices = [map {vbsearch($v,$_,$nbits,$ilo,$ihi)} @keys];
vabsearch_lb($v,\@keys,$nbits,?$ilo,?$ihi)
$indices = [map {vbsearch_lb($v,$_,$nbits,$ilo,$ihi)} @keys];
vabsearch_ub($v,\@keys,$nbits,?$ilo,?$ihi)
$indices = [map {vbsearch_ub($v,$_,$nbits,$ilo,$ihi)} @keys];
vvbsearch($v,$keyvec,$nbits,?$ilo,?$ihi)
$ixvec = pack('N*', @{vabsearch($v,vec2array($keyvec,$nbits),$nbits,$ilo,$ihi)});
vvbsearch_lb($v,$keyvec,$nbits,?$ilo,?$ihi)
$ixvec = pack('N*', @{vabsearch_lb($v,vec2array($keyvec,$nbits),$nbits,$ilo,$ihi)});
vvbsearch_ub($v,$keyvec,$nbits,?$ilo,?$ihi)
$ixvec = pack('N*', @{vabsearch_ub($v,vec2array($keyvec,$nbits),$nbits,$ilo,$ihi)});
vget($vec,$i,$nbits)
vec($vec,$i,$nbits)
.
vset($vec,$i,$nbits,$newval)
vec($vec,$i,$nbits)=$newval
.
vec2array($vec,$nbits)
[map {vec($vec,$_,$nbits)} (0..(length($vec)*8/$nbits-1))]
vec() in perlfunc(1), PDL(3perl), perl(1).
Bryan Jurish <moocow@cpan.org>
Copyright (C) 2012 by Bryan Jurish
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.1 or, at your option, any later version of Perl 5 you may have available.
Algorithm::BinarySearch::Vec - binary search functions for vec-vectors with fast XS implementations |