<?php
//演示数组的二分查找算法:
//前提:
//1,索引数组;
//2,数组是已经排好序的了。
$arr1 = [2, 5, 8];//, 10, 15, 18, 22, 24, 24, 28,33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70];
$search = 3; //具体分析,可以将该数据修改为不同的值,比如:2, 5, 8,
//原理:每次都找该数组的某一段的中间项,并跟要找的目标进行“对比”
//1,如果刚好相等,则就算找出来了
//2, 如果中间项比目标大,就只要去左边的那一半中找
//3, 如果中间项比目标小,就只要去右边的那一半中找//假设有这么一个函数,它能够从某个数组$arr中的某个下标范围($start---$end)中找指定的数据$value
//这里,假设:$start一定是不能大于$end,否则,我们就认为找不到了!
function binary_search($arr, $value, $start, $end)
{if($start > $end){return false;}$mid = floor(($start + $end)/2); //取得两个下标中的中间下标(一半位置)$mid_value = $arr[$mid]; //中间项的值//如果刚好相等,则就算找出来了if($mid_value == $value){return true;}//如果中间项比目标大,就只要去左边的那一半中找elseif($mid_value > $value) //{$new_start = $start;$new_end = $mid-1;return binary_search($arr, $value, $new_start, $new_end);}//如果中间项比目标小,就只要去右边的那一半中找else{$new_start = $mid+1;$new_end = $end;return binary_search($arr, $value, $new_start, $new_end);}}
$len = count($arr1);
$result = binary_search($arr1,$search, 0, $len-1);
var_dump($result);
<?php
function binary_search($arr,$value,$start,$end)
{if($start>$end){return false;}$mid = floor(($start + $end)/2);$mid_value = $arr[$mid]; //中间项的值if($mid_value==$value){return true;}elseif($mid_value>$value){ //当中间数 大于 值$newstart = $start;$newend = $mid-1;return binary_search($arr,$value,$newstart,$newend);}else{//当中间数 小于 值$newstart = $mid+1;$newend = $end;return binary_search($arr,$value,$newstart,$newend);}
}
$arr1 = range(3,100);//生成0-100的数组
$len = count($arr1);
$search = 1;
$result = binary_search($arr1,$search, 0, $len-1);
var_dump($result);
数组查找算法
查找算法,就是从一个数组中,找一个“目标”(可以是值,也可以是键)的算法。
数组的查找函数:
in_array() :在一个数组中找是否存在某个数据。
array_search() : 在数组中搜索给定的值,如果成功则返回相应的键名
array_key_exists() : 检查给定的键名或索引是否存在于数组中
一种查找算法:
遍历查找:不值得一提!
-
-
- 二分查找:
-
此查找算法针对的数组有以下条件:
1,索引数组;
2,数组是已经排好序的了。
算法演示:
$arr1 = [2, 5, 8];//, 10, 15, 18, 22, 24, 24, 28,33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70];
$search = 3; //具体分析,可以将该数据修改为不同的值,比如:2, 5, 8,
//原理:每次都找该数组的某一段的中间项,并跟要找的目标进行“对比”
//1,如果刚好相等,则就算找出来了
//2, 如果中间项比目标大,就只要去左边的那一半中找
//3, 如果中间项比目标小,就只要去右边的那一半中找
//假设有这么一个函数,它能够从某个数组$arr中的某个下标范围($start---$end)中找指定的数据$value
//这里,假设:$start一定是不能大于$end,否则,我们就认为找不到了!
function binary_search($arr, $value, $start, $end)
{
if($start > $end)
{
return false;
}
$mid = floor(($start + $end)/2); //取得两个下标中的中间下标(一半位置)
$mid_value = $arr[$mid]; //中间项的值
//如果刚好相等,则就算找出来了
if($mid_value == $value){
return true;
}
//如果中间项比目标大,就只要去左边的那一半中找
elseif($mid_value > $value) //
{
$new_start = $start;
$new_end = $mid-1;
return binary_search($arr, $value, $new_start, $new_end);
}
//如果中间项比目标小,就只要去右边的那一半中找
else
{
$new_start = $mid+1;
$new_end = $end;
return binary_search($arr, $value, $new_start, $new_end);
}
}
$len = count($arr1);
$result = binary_search($arr1,$search, 0, $len-1);
var_dump($result);