什么是二分查找
- 二分查找是一种优化的数据查找方法
- 二分查找是适用前提是:有序数组
- 二分查找复杂度:O(logn)
二分查找代码实现
function bsearch($array, $size, $value) {
$low = 0;
$high = $size - 1;
while ($low <= $high){
$mid = intval(($low + $high)/2);
if ($value == $array[$mid]) return $mid;
else if ($value > $array[$mid]) $low = $mid + 1;
else $high = $mid - 1;
}
return -1;
}
function bsearch2($array, $size, $value){
return tool($array, 0, $size-1, $value);
}
function tool($arr, $low, $high, $value) {
if ($low > $high) return -1;
$mid = intval(($low + $high)/2);
if ($value == $array[$mid])
return $mid;
else if ($value > $array[$mid])
return tool($arr, $low+1, $high, $value);
else
return tool($arr, $low, $mid-1, $value);
}
二分查找变形
function sfirst($array, $size, $value)
{
$low = 0;
$high = $size - 1;
while ($low <= $high) {
$mid = intval(($low + $high) / 2);
if ($value > $array[$mid]) {
$low = $mid + 1;
} else if ($value < $array[$mid]) {
$high = $mid - 1;
} else {
if (0 == $mid || $array[$mid - 1] != $value) return $mid;
else $high = $mid - 1;
}
}
return -1;
}
function last($array, $size, $value)
{
$low = 0;
$high = $size - 1;
while ($low <= $high) {
$mid = intval(($low + $high) / 2);
if ($value > $array[$mid]) {
$low = $mid + 1;
} else if ($value < $array[$mid]) {
$high = $mid - 1;
} else {
if ($size - 1 == $mid || $array[$mid + 1] != $value) return $mid;
else $low = $mid + 1;
}
}
return -1;
}
function sfirst_($array, $size, $value)
{
$low = 0;
$high = $size - 1;
while ($low <= $high) {
$mid = intval(($low + $high) / 2);
if ($value > $array[$mid]) {
$low = $mid + 1;
} else {
if (0 == $mid || $array[$mid - 1] < $value) {
return $mid;
} else {
$high = $mid - 1;
}
}
}
return -1;
}
function last_($array, $size, $value)
{
$low = 0;
$high = $size - 1;
while ($low <= $high) {
$mid = intval(($low + $high) / 2);
if ($value < $array[$mid]) {
$high = $mid - 1;
} else {
if ($size - 1 == $mid || $array[$mid + 1] > $value) return $mid;
else $low = $mid + 1;
}
}
}
其他
- 针对数组来说,可以运用二分查找方式获取指定的值
- 对于链表来说,同样有优化的查询方法,在有序链表上层添加多层索引,查询时通过上层索引层层向下,快速定位到目标,这种数据结构叫跳表