PHP——二分法查找数据
02-常用算法---二分法查找

减 半
low high mid
要点: ➢ 二分法查找只适用于有序数组; ➢ 终止循环查找过程有两种情况:
• 在某次查找过程中找到:x==a[mid] • 查找完毕未找到:low>high
low=0; high=N-1; while(low<=high ) {
mid=(low+high)/2; if (x==a[mid])
④ 重复② 、③ 两步直到找到x;或再无查找区域(low>high)。
假设要查找的数据key为21
初 5 13 19 21 37 56 64 75 80 88 92 始
low
mid
high
减 5 13 19 21 37 56 64 75 80再 5 13 19 21 37 56 64 75 80 88 92
low=0,high=N-1;
② 求待查区间中间元素的下标mid =(low+high)/2,然后通过 a[mid]和x比较的结果决定后续查找范围;
③ 若x==a[mid],则查找完毕,结束查找过程; 若x>a[mid],则只需再查找a[mid]后面的元素,修改区间下
界low = mid+1;
若x<a[mid],则只需再查找a[mid]前面的元素,修改区间上 界high = mid-1;
break ; else if (x>a[mid])
low=mid+1 ; else
high=mid-1; } if( low>high )
cout<<"未找到"<<endl;
else
cout<<mid<<endl;
查找算法之二分查找算法

查找算法之二分查找算法二分查找算法(Binary Search)是一种在有序数组中快速查找目标值的算法。
它的基本思想是通过不断二分待查找区间,缩小查找范围,直到找到目标值或者确定目标值不存在。
二分查找算法的实现步骤如下:1. 确定待查找数组的起始位置 low 和结束位置 high,初始时 low = 0,high = 数组长度减12. 计算中间位置 mid,mid = (low + high) / 23.将目标值与中间位置的元素进行比较。
-如果目标值等于中间位置的元素,则找到目标值,返回中间位置。
- 如果目标值小于中间位置的元素,则目标值在数组的前半部分,更新 high = mid - 1,回到步骤2进行下一轮查找。
- 如果目标值大于中间位置的元素,则目标值在数组的后半部分,更新 low = mid + 1,回到步骤2进行下一轮查找。
4. 当 low 大于 high 时,代表目标值不存在于数组中,查找结束,返回 -1二分查找算法的时间复杂度为 O(log n),其中 n 为数组长度。
由于每次查找都将查找范围缩小一半,所以它比线性查找算法的效率高很多。
除了基本的二分查找算法,还有一些变体的二分查找算法,如查找第一个与目标值相等的元素、查找最后一个与目标值相等的元素、查找第一个大于目标值的元素、查找最后一个小于目标值的元素等。
这些变体算法在算法思想上与基本的二分查找类似,只是在比较目标值与中间位置元素时稍微有所不同,并通过不同的条件更新 low 和 high 的值,从而实现不同的查找逻辑。
综上所述,二分查找算法是一种高效的查找算法,应用广泛且实用。
它的核心思想简单明了,通过将待查找区间逐渐缩小,快速定位目标值。
在实际应用中,我们需要根据具体问题场景选择恰当的二分查找算法,并注意一些特殊情况的处理,如数组为空、数组长度为0等。
二分法查找数值

二分法查找数值
二分法查找数值
二分法,也叫二分查找,是一种在有序数组中查找特定元素的算法。
其基本思想是每次取数组中间的值与目标值进行比较,然后根据比较结果舍弃一半的数据,直到找到目标值或者发现目标值不存在为止。
二分法查找数值的具体步骤如下:
1. 初始化左右指针,left=0,right=n-1。
(n为数组长度)
2. 当left小于等于right时,进行以下操作:
3. 取中间值middle=(left+right)/2。
4. 如果中间值等于目标值,返回目标值的位置。
5. 如果中间值大于目标值,说明目标值在middle的左侧,将right更新为middle-1。
6. 如果中间值小于目标值,说明目标值在middle的右侧,将left更
新为middle+1。
7. 如果循环结束还没有找到目标值,说明目标值不存在,返回-1。
二分法的时间复杂度为O(logN),是一种十分高效的查找算法,因此
在很多情况下都被广泛应用。
其中包括在数据量较大的有序数组中查
找特定元素,以及在游戏中对答案进行猜测等。
总之,二分法通过逐步缩小查找范围,可以快速高效地查找指定元素,是一种很实用的算法。
在实际使用时,需要注意的是数组必须是有序的,否则无法保证算法正确性。
同时,由于函数栈空间有限,在数据
量较大时需要注意是否会爆栈。
PHP代码实现二分法查找

PHP代码实现⼆分法查找
需求:定义⼀个函数接收⼀个数组对象和⼀个要查找的⽬标元素,函数要返回该⽬标元素在数组中的索引值,如果⽬标元素不存在数组中,那么返回-1表⽰。
//折半查找法(⼆分法): 使⽤前提必需是有序的数组。
//如果是从⼩到⼤的数组
function halfSearch($arr, $target)
{
//定义三个变量分别记录最⼩、最⼤、中间元素的索引值
$min = 0;
$max = count($arr) - 1;
$mid = floor(($min + $max) / 2);
while (true) {
if ($target > $arr[$mid]) {//如果⽬标值⼤于中间值,⽬标值应该在中间值右边
$min = $mid + 1;
} elseif ($target < $arr[$mid]) {//如果⽬标值⼩于中间值,⽬标值应该在中间值左边
$max = $mid - 1;
} else {//如果中间值等于⽬标值那么中间值的索引即为要查找的⽬标元素的索引
return$mid;
}
//如果max或者min 发⽣变化后出现下⾯这种情况说明⽬标值不在该数组范围内
if ($max < $min) {
return -1;
}
$mid = floor(($min + $max) / 2);
}
}。
PHP视频教程之PHP有序表查找之二分查找(折半查找)算法

PHP视频教程之PHP有序表查找之二分查找(折半查找)算法本篇文章小编带读者们来了解一下PHP有序表查找之二分查找(折半查找)的算法,对PHP 开发技术感兴趣想要了解的小伙伴下面就随小编一起来了解一下吧。
本文实例讲述了PHP有序表查找之二分查找(折半查找)算法。
分享给大家供大家参考,具体如下:简介:二分查找技术,又称为折半查找。
它的前提是线性表中的记录必须是关键码有序(通常从小到达有序),线性表必须采用顺序存储。
基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。
不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。
代码:<?php//二分搜索(折半查找)算法(前提是数组必须是有序数组) 时间复杂度是O(logn)$i = 0; //存储对比的次数//@param 待查找数组//@param 待搜索的数字function binsearch($arr,$num){$count = count($arr);$lower = 0;$high = $count - 1;global $i;while($lower <= $high){$i ++; //计数器if($arr[$lower] == $num){return $lower;}if($arr[$high] == $num){return $high;}$middle = intval(($lower + $high) / 2);if($num < $arr[$middle]){$high = $middle - 1;}else if($num > $arr[$middle]){$lower = $middle + 1;}else{return $middle;}}//返回-1表示查找失败return -1;}$arr = array(0,1,16,24,35,47,59,62,73,88,99);$pos = binsearch($arr,62);print($pos);echo "<br>";echo $i;运行结果:73总结:二叉查找的时间复杂度是 O(logn)。
计算机二分法查找例子

计算机二分法查找例子二分法,也称作二分查找,是一种常用的算法,可以用来在有序数组中查找特定元素。
这种算法通过将范围逐渐缩小一半,最终得到结果。
下面我将为您详细介绍二分法查找以及一个具体的例子。
二分法查找算法的基本思想是:首先确定数组的中间位置,如果该位置上的值等于目标值,则查找成功;如果该位置上的值大于目标值,则在数组的前半部分继续进行二分查找;如果该位置上的值小于目标值,则在数组的后半部分继续进行二分查找。
不断重复以上过程,直到找到目标值或者范围缩小为空。
以下是一个使用二分法查找的例子:假设有一个有序数组arr[],其元素值为:[2, 4, 6, 8, 12, 16, 18, 22, 28, 34, 40],我们要查找的目标值为16首先,找到数组的中间位置,即arr[5]为16、由于arr[5]等于目标值,所以查找成功,返回结果为索引值5如果要查找的目标值为10,则arr[5]大于目标值,所以继续在数组的前半部分继续进行二分查找。
此时,范围缩小为[2, 4, 6, 8]。
接下来,再次找到数组的中间位置,即arr[2]为6、由于arr[2]小于目标值,所以在数组的后半部分继续进行二分查找。
此时,范围缩小为[8]。
再次找到数组的中间位置,即arr[0]为2、由于arr[0]小于目标值,所以在数组的后半部分继续进行二分查找。
此时,范围缩小为[4]。
最后,再次找到数组的中间位置,即arr[0]为4、由于arr[0]大于目标值,所以在数组的前半部分继续进行二分查找。
此时,范围缩小为空。
由于范围已经缩小为空,所以查找失败,返回结果为-1二分法查找的时间复杂度为O(log n),其中n为数组的长度。
与线性查找相比,二分法查找的效率更高,尤其是在数组较大的情况下。
但是,使用二分法查找的前提是数组必须是有序的。
如果数组是无序的,需要先进行排序操作,然后再使用二分法查找。
总结一下,二分法查找是一种高效的算法,适用于有序数组。
PHP二分查找算法

PHP⼆分查找算法
思路:递归算法。
在⼀个已经排好序的数组中查找某⼀个数值,每⼀次都先跟数组的中间元素进⾏⽐较,若相等则返回中间元素的位置,若⼩于中间元素,则在数组中⼩于中间元素的部分查找,若⼤于中间元素,则在数组中⼤于中间元素的部分查找,若查找不到则返回-1.
function binSearch($arr,$head,$tail,$find)
{
if($head > $tail) { //开始位置⼤于末尾位置,表⽰没找到
return -1;
}
$mid = intval(($head+$tail)/2);
if($arr[$mid] == $find) {
return $mid;
} else if($arr[$mid] < $find) {
return binSearch($arr,$mid+1,$tail,$find);
} else {
return binSearch($arr,$head,$mid-1,$find);
}
}
注意:
在计算中间位置的时候不能直接写$mid = ($head+$tail)/2;,因为PHP是弱类型语⾔,它并不会将($head+$tail)/2得到的结果强制转化为整数,所以得到的有可能是⼩数,⽽数组的下标数值是没有⼩数的,从⽽导致程序出错。
所以在这⾥使⽤intval函数对得到的结果进⾏取整。
关于PHP的取整函数,若想了解更多,可以参考我的另⼀篇博⽂:。
php中二分法查找算法实例分析

php中⼆分法查找算法实例分析本⽂实例讲述了php中⼆分法查找算法实现⽅法。
分享给⼤家供⼤家参考,具体如下:⼆分法查找在⾼级点的开发可能会⽤到了,当然在⼤公司找⼯作时都会有⾯试题是这种了,下⾯我们来看⼀篇关于⼆分法查找在php中实现⽅法,具体的细节如下所⽰.⼆分法(dichotomie)即⼀分为⼆的⽅法,设[a,b]为R的闭区间,逐次⼆分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任⼀⾃然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表⽰[an,bn]的中点.例⼦1:header('Content-Type: text/html; charset=utf-8;');$arr = array(2,33,22,1,323,321,28,36,90,123);sort($arr);//⼆分法查找echo $index = binarySearch($arr,321);function binarySearch($arr,$key){$len = count($arr);$mid = -1;$start = 0;$end = $len-1;while($start<=$end){$mid = (int)(($start+$end)/2);echo $mid."\n";if($arr[$mid] == $key){return $mid;}else if($arr[$mid] < $key){$start = $mid+1;}else if($arr[$mid] > $key){$end = $mid-1;}}}例⼦2:<?php//search函数其中$array为数组,$k为要找的值,$low为查找范围的最⼩键值,$high为查找范围的最⼤键值function search($array, $k, $low=0, $high=0){if(count($array)!=0 and $high == 0) //判断是否为第⼀次调⽤{$high = count($array);}if($low <= $high) //如果还存在剩余的数组元素{$mid = intval(($low+$high)/2); //取$low和$high的中间值if ($array[$mid] == $k) //如果找到则返回{return $mid;}elseif ($k < $array[$mid]) //如果没有找到,则继续查找{return search($array, $k, $low, $mid-1);}else{return search($array, $k, $mid+1, $high);}}return -1;}$array = array(4,5,7,8,9,10); //测试search函数echo search($array, 8); //调⽤search函数并输出查找结果>更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》、《》、《》、及《》希望本⽂所述对⼤家PHP程序设计有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
继续使用顺序法查找数据会使得 PHP 的效率变低。 这时我们引入了二分法查找数据。
二分法就是在 PHP 的数组中假象数组排好序了,然后通过对数组元素的比较得到结果。比较一次就会排出 1/2的数组。 例如:
function Dichotomy($php,$k,$low=0,$max=0)
{
if(count($php)!= 0 and $max == 0)
{
$max = count($php);
}
if($low <= $max)
{
$mid = intval(($low+$max)/2);
if($php[$mid] == $k)
{
return $mid;
}
elseDichotomy($php,$k,$low,$mid-1);
}
else
{
return Dichotomy($php,$k,$mid+1,$max);
}
}
return -1;
}
$php = array('1','2','3','4','5','6');
echo Dichotomy($php,5);
?> 结果是: 4 返回的是键值。 这个 PHP 例子说的是在已知数组排序的情况和所需要查找的数据下所进行的: 将数组中的最小和最大值相 加取平均,因为已经知道所要查找的元素了,就比如我这个例子,所以从$mid+1到$max 开始查找。 这样我们会想:天下哪里有这么便宜的事,谁实现知道所有的数组呢。所以,这种方法也不是很方便。 那么,你有什么建议呢?
{
return Dichotomy($php,$k,$mid+1,$max);
}
}
return -1;
}
$php = array('1','2','3','4','5','6');
echo Dichotomy($php,5);
?> 结果: Warning: Missing argument 3 for Dichotomy(), called in E:\xampp\htdocs\php\Test\8.5.2.php on line 29 and defined inE:\xampp\htdocs\php\Test\8.5.2.php on line 3 Warning: Missing argument 4 for Dichotomy(), called in E:\xampp\htdocs\php\Test\8.5.2.php on line 29 and defined inE:\xampp\htdocs\php\Test\8.5.2.php on line 3 4 这是我第一次做的时候呈现的错误。问题出在哪里呢? 好吧:新手问题。因为在函数刚开始没有给$low 和$max 赋值,使得函数的 if 没有办法进行。 正确的代码如下: <?php //函数名称为 Dichotomy ,$php 为数组,$k 为要查找的值,$low 为最小的值,$max 为最大值
<?php //函数名称为 Dichotomy ,$php 为数组,$k 为要查找的值,$low 为最小的值,$max 为最大值
function Dichotomy($php,$k,$low,$max)
{
if(count($php)!= 0 and $max == 0)
{
$max = count($php);
}
if($low <= $max)
{
$mid = intval(($low+$max)/2);
if($php[$mid] == $k)
{
return $mid;
}
else if($k < $php[$mid])
{
return Dichotomy($php,$k,$low,$mid-1);
}
else