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程序设计有所帮助。
二分法的动画演示课件

40 high
A(40)
要查找的数据是 key
mid=int((low+high)/2)
Key=a(mid) 找到了
Key>a(mid) low=mid+1 Key<a(mid)
思考 1
low
A(1)
A(1)
A(1)
20
·mid
A(20)
40 high
A(40)
21 low
A(21)
·30
Key=a(mid) 找到了
Key>a(mid) low=mid+1 Key<a(mid) high=mid-1
·21 22 24
low mid high
A(21) A(22) A(24)
A(40)
思考 1
low
A(1)
A(1)
A(1)
A(1) A(1)
20
·mid
A(20)
40 high
A(40)
二分查找(对分查找)
查找条件: 被查找的数据必须是有序的。
基本思想: 在有序的数据列中,首先将要查找的数据与有序数组
内处于中间位置的数据进行比较,如果两者相等,则查 找成功;否则根据数组元素的有序性,就可确定该数据 应该在数组的前半部分还是后半部分继续进行查找;在 新确定的范围内,继续按上述方法进行查找,直到找到 要查找的数据,即查找成功,或直到子表不存在,即查 找不成功。
21 low
A(21)
·30
mid
A(30)
40 high
A(40)
21 Low
·25 29 mid high
A(21) A(25) A(29)
lookup二分法查找原理

lookup二分法查找原理摘要:一、二分法查找原理简介1.二分法查找的基本思想2.二分法查找的优缺点二、二分法查找在实际应用中的案例1.案例一:查找数字序列中的目标值2.案例二:查找字符串序列中的目标字符三、二分法查找的Python 实现1.实现二分法查找的函数2.函数的参数与返回值四、二分法查找在编程中的意义1.提高查找效率2.简化程序逻辑正文:一、二分法查找原理简介二分法查找,又称为折半查找,是一种高效的查找方法。
其基本思想是将待查找的序列不断缩小范围,直到找到目标值或确定目标值不存在为止。
具体来说,二分法查找首先确定序列的中间位置,然后判断目标值是否在该位置上。
如果目标值等于中间位置的值,则查找成功;如果目标值小于中间位置的值,则在序列左半部分继续查找;如果目标值大于中间位置的值,则在序列右半部分继续查找。
重复以上过程,直到找到目标值或确定目标值不存在。
二分法查找的优缺点优点:二分法查找的平均查找次数较少,仅需log2(n) 次,其中n 为序列的长度。
这使得二分法查找在处理大数据时具有较高的效率。
缺点:二分法查找要求序列是有序的,这限制了它的应用场景。
此外,二分法查找在某些特殊情况下,如序列元素重复或元素值分布均匀时,可能不如顺序查找效率高。
二、二分法查找在实际应用中的案例1.案例一:查找数字序列中的目标值假设有一个数字序列:1, 3, 5, 7, 9, 11, 13, 15, 17, 19。
现在需要查找目标值13 在该序列中的位置。
可以使用二分法查找,首先确定序列的中间位置为第5 个元素,即11。
由于13 大于11,所以目标值可能在序列的右半部分。
接下来,缩小右半部分范围,继续查找。
重复以上过程,最终找到目标值13 在第7 个位置。
2.案例二:查找字符串序列中的目标字符假设有一个字符串序列:"apple", "banana", "cherry", "date", "fig", "grape"。
PHP实现二分查找算法

PHP实现⼆分查找算法⼆分查找 ⼆分查找也称折半查找(Binary Search),它是⼀种效率较⾼的查找⽅法。
但是,折半查找要求线性表必须采⽤顺序存储结构,⽽且表中元素按关键字有序排列。
⾸先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字⽐较,如果两者相等,则查找成功;否则利⽤中间位置记录将表分成前、后两个⼦表,如果中间位置记录的关键字⼤于查找关键字,则进⼀步查找前⼀⼦表,否则进⼀步查找后⼀⼦表。
重复以上过程,直到找到满⾜条件的记录,使查找成功,或直到⼦表不存在为⽌,此时查找不成功。
使⽤循环⽅式实现⼆分查找/*** ⼆分查找(Binary Search)算法,也叫折半查找算法。
⼆分查找的思想⾮常简单,有点类似分治的思想。
* ⼆分查找针对的是⼀个有序的数据集合,每次都通过跟区间的中间元素对⽐,* 将待查找的区间缩⼩为之前的⼀半,直到找到要查找的元素,或者区间被缩⼩为 0。
** 循环写法* @param array $array 待查找的数组* @param int $findVal 要查找的值* @return int 返回找到的数组键*/function binarySearch($array, $findVal){// ⾮数组或者数组为空,直接返回-1if (!is_array($array) || empty($array)) {return -1;}// 查找区间,起点和终点$start = 0;$end = count($array) - 1;while ($start <= $end) {// 以中间点作为参照点⽐较,取整数$middle = intval(($start + $end) / 2);if ($array[$middle] > $findVal) {// 查找数⽐参照点⼩,则要查找的数在左半边// 因为 $middle 已经⽐较过了,这⾥需要减1$end = $middle - 1;} elseif ($array[$middle] < $findVal) {// 查找数⽐参照点⼤,则要查找的数在右半边// 因为 $middle 已经⽐较过了,这⾥需要加1$start = $middle + 1;} else {// 查找数与参照点相等,则找到返回return$middle;}}// 未找到,返回-1return -1;}// 调⽤$array = [10,12,16,19,20,34,56,78,84,95,100];echo binarySearch($array, 84);使⽤递归⽅式实现⼆分查找/*** 递归写法* @param array $array 待查找的数组* @param int $findVal 要查找的值* @param int $start 查找区间,起点* @param int $end 查找区间,终点* @return int 返回找到的数组键*/function binarySearch($array, $findVal, $start, $end){// 以中间点作为参照点⽐较,取整数$middle = intval(($start + $end) / 2);if ($start > $end) {return -1;}if ($findVal > $array[$middle]) {// 查找数⽐参照点⼤,则要查找的数在右半边return binarySearch($array, $findVal, $middle + 1, $end); } elseif ($findVal < $array[$middle]) {// 查找数⽐参照点⼩,则要查找的数在左半边return binarySearch($array, $findVal, $start, $middle - 1); } else {return$middle;}}// 调⽤$array = [10,12,16,19,20,34,56,78,84,95,100];echo binarySearch($array, 95, 0, count($array)-1);。
PHP实现二分法查找

PHP实现⼆分法查找php实现⼆分法的查找其实很简单,跟我⼀起来看看怎么实现吧。
⼆分法查找需要数组是⼀个递增的数组。
想要写出⼆分法查找的代码,⾸先要懂得⼆分法实现查找的原理:①要知道中间位置就需要知道起始位置和结束位置,然后取出中间位置的值来和我们的值做对⽐。
②如果中间值⼤于我们的给定值,说明我们的值在中间位置之前,此时需要再次⼆分,因为在中间之前,所以我们需要变的值是结束位置的值,此时结束位置的值应该是我们此时的中间位置。
③反之,如果中间值⼩于我们给定的值,那么说明给定值在中间位置之后,此时需要再次将后⼀部分的值进⾏⼆分,因为在中间值之后,所以我们需要改变的值是开始位置的值,此时开始位置的值应该是我们此时的中间位置,直到我们找到指定值。
④或者中间值等于最初的起始位置,或结束位置(此时说明给定值未找到)。
下⾯就看看怎么实现⼆分法吧/*** ⼆分查找* @param Array $arr 待查找的数组* @param Int $key 要查找的关键字* @return Int*/function bin_search(Array $arr,$key){$high = count($arr);if($high <= 0)return 0;$low = 0;while($low <= $high){//当前查找区间arr[low..high]⾮空$mid=intval(($low + $high) / 2);if($arr[$mid] == $key)return $mid; //查找成功返回if($arr[$mid] > $key)$high = $mid - 1; //继续在arr[low..mid-1]中查找else$low = $mid + 1; //继续在arr[mid+1..high]中查找}return 0; //当low>high时表⽰查找区间为空,查找失败}$arr = array(1,2,4,6,10,40,50,80,100,110);echo bin_search($arr,80);。
php中的查找算法和排序方法(多字段排序)

php中的查找算法和排序⽅法(多字段排序)⼀、查找算法1、顺序查找(⼀个⼀个查,效率低,不⽤多说)2、⼆分查找/*php ⼆分查找在$a数组⾥查找$x的位置$a必须是⼀个以升序排序后的数组*/function binsearch($find,$arr){$count = count($arr);$start = 0;$end = $count-1;while($start<=$end){$middle = intval(($start+$end)/2);if($arr[$middle]>$find){$end = $middle-1;}elseif($arr[$middle]<$find){$start = $middle+1;}else{return$middle;}}return -1;}⼆、排序算法1、冒泡排序冒泡排序第⼀次排出最⼤的数,第⼆次排出第⼆⼤的,$arr=[5,3,5,7,1,9];function bubblesearch($arr){$len = count($arr);for($i=1;$i<$len;$i++){for($j=0;$j<len-$i;$j++){if($arr[$j+1]<$arr[j]){$temp = $arr[$j+1];$arr[j+1] = $arr[j];$arr[j] = $temp;}}}}2、⾃带的排序函数sort() 函数⽤于对数组单元从低到⾼进⾏排序。
rsort() 函数⽤于对数组单元从⾼到低进⾏排序。
asort() 函数⽤于对数组单元从低到⾼进⾏排序并保持索引关系。
arsort() 函数⽤于对数组单元从⾼到低进⾏排序并保持索引关系。
ksort() 函数⽤于对数组单元按照键名从低到⾼进⾏排序。
krsort() 函数⽤于对数组单元按照键名从⾼到低进⾏排序usort(array,function($a,$b){if($a>$b){return 1;}else{return -1;}})array_multisort() 这个函数可以对多个PHP数组进⾏排序,排序结果是所有的数组都按第⼀个数组的顺序进⾏排列3、array_multisort() 实际⽤法,实现多维数据按照多个字段排序例⼦:按照年龄从⼤到⼩的顺序排列,如果年龄相同就按照名字的顺序排序$array[] = array("age"=>20,"name"=>"li");$array[] = array("age"=>21,"name"=>"ai");$array[] = array("age"=>20,"name"=>"ci");$array[] = array("age"=>22,"name"=>"di");foreach ($array as$key=>$value){$age[$key] = $value['age'];$name[$key] = $value['name'];}array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$array); print_r($array);。
PHP二分查找(详细)

PHP⼆分查找(详细)<?php// PHP ⼆分查找function search(arr,sea){low=0;//确定数组的开始的下标len = count(arr)−1;//确定数组的最后⼀下标数组的长度−1//echo len; exit; while( low<=len ) {// 向下取整 2.9 => 2num=floor((low + len)/2);//echo num; echo "<br><br><br>";// 中间元素和要查询的⽐较⼤⼩// 判读是否是中间的那为数是返回if(arr[num] == sea)return$num;//中间元素⽐⽬标⼤,查找左部if(arr[num]>sea){len=num - 1;//echo len; echo "<br>"; } // 中间元素⽐⽬标⼩,查找右部 if(arr[num]<sea) {low=num + 1;//echo low; echo "<br>"; } } return false; } //使⽤⼆分式算法查找数据arr = array(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29);// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14sch[′1′]=search(arr, 27); // 结果 13// num=7//arr['7'] = 15 < 27 low=8;num = (8 + 14)/2 = 11// arr[′11′]=23<27low = 12; num=(12+14)/2=13//arr['13'] = 27 = 27sch[′2′]=search(arr, 17); // 结果 8// num=7//arr['7'] = 15 < 17 low=num + 1 = 8; num=(8+14)/2=11//arr['11'] = 23 > 17 len=num - 1 = 10;num=(8+10)/2=9//arr['9'] = 19 > 17 len=num - 1 = 8; num=(8+8)/2=8//arr['8'] = 17 = 17var_dump($sch); // array(2) { [1]=> float(13) [2]=> float(8) }>Processing math: 100%。
算法-二分法查找

算法-⼆分法查找什么是⼆分法查找⼆分法查找主要是为了快速查找给定数组内,期待值在数组中的位置(下标)⼆分法查找通过对整个数组取中间值,判断期待值所在的范围并缩⼩范围,每次查找范围折半,直到范围的边界重合,得出期待值的位置,如果找不到返回null⼆分法有⼀个先决条件是:数组内元素必须是有序的简单图解给定⼀个包含1,3,5,7,8,9这⼀个元素的有序数组,求得期待值7所在的位置,下边⽤绿块表⽰指针所在位置若是按照直接遍历的⽅式,绿块会从数组的第⼀个下标开始⽐较,直到7所在的下标得到结果,遍历需要4次,下边演⽰下⼆分法的图⽰第⼀次,取值范围为整个数组,取数组长度中间值(0+5)/2取整2作为下标取中间值初始以数组的第⼀个下标与最后⼀个下标相加取中间值,如果不为整,舍去⼩数部分⽐较期待值与下标为2的值⼤⼩,发现5<7,7这个值应在中间值的右侧缩⼩查找范围为中间值+1与最⼤下标第⼆次,范围缩⼩为原数组的⼀半,下标不变,取中间值(3+5)/2=4下标4对应的值8,⼤于7,所以向左取范围最⼩下标3,最⼤下标4-1=3第三次,取中间值(3+3)/2=3,下标3上的值恰好与期待值相等,返回下标3虽然看起来只少了⼀次,原因在数组的长度⼩,另外就是期待值设置的⼩,再举个长⼀点的例⼦,这⾥有1-100的数组,100个元素,期待值为100简单遍历次数最⼤为元素的个数n次,本例中100次使⽤⼆分查找只需要log2n次,本例中7次!⼆分法查找的Java实现package binarysearch;/*** ⼆分查找:求得期待值在有序数组中的位置* @author hellxz*/public class MyBinarySearch {/*** ⼆分查找算法实现* @param orderedArray 有序数组* @param expect 期待数值* @return 期待值在数组中的下标,如果期待数值不在数组中,返回null*/public static Integer binarySearch(int[] orderedArray, int expect) {//low与high构成动态的数组下标范围//初始low下标为0,high为数组长度-1int low = 0;int high = orderedArray.length - 1;//当数组范围存在时,有两种情况:最⼩边界值⼩于最⼤边界值或两个边界值相等;//最⼩边界值不⼤于最⼤边界值是有意义的,表⽰范围的存在,如果范围不存在了,说明数组中⽆此元素while (low <= high) {//取两个边界下标的中间下标与中间值,作为下标时会⾃动取整int middle = (low + high) / 2;int middleVal = orderedArray[middle];//中间值与期待值相等,说明中间值的下标就是我们要找的期待数的下标if (middleVal == expect) {return middle;}//中间值⼩于期待值,我们需要将最⼩边界下标移到中间下标的下⼀位//此时,最⼤边界不变,最⼩边界变⼤,范围缩⼩原来⼀半if (middleVal < expect) {low = middle + 1;}//中间值⼤于期待值,说明最⼤边界应⼩于中间下标if (middleVal > expect) {high = middle - 1;}}//循环结束未返回下标说明数组中不存在期待元素,返回nullreturn null;}public static void main(String[] args) {int[] arr = { 2, 4, 5, 6, 10, 18, 19,22, 25, 70};int expectVal = 25;System.out.printf("当前期待的值为%d,其所在的下标为%d", expectVal, binarySearch(arr, expectVal));}}最后本⼈不是科班出⾝,很多知识都在学习中,算法与数据结构系列将不定时更新(学会哪个更哪个 )。
数组二分法查找-概述说明以及解释

数组二分法查找-概述说明以及解释1.引言1.1 概述在计算机科学中,数组是一种常见的数据结构,可以用于存储一系列相同类型的元素。
而二分法查找是一种高效的查找算法,它适用于有序数组中进行查找特定元素的情况。
数组的二分法查找是通过将数组分为两部分,并与目标元素进行比较来确定目标元素的位置。
具体步骤是首先确定数组的中间元素,然后将目标元素与中间元素进行比较。
如果两者相等,则目标元素找到;如果目标元素小于中间元素,则在前半部分继续查找;如果目标元素大于中间元素,则在后半部分继续查找。
通过重复这一过程,最终可以确定目标元素是否存在于数组中。
二分法查找具有时间复杂度为O(log n)的优势,相比于线性查找的时间复杂度O(n),在处理大型有序数组时具有明显的效率提升。
因此,二分法查找在处理大规模数据集、需要频繁查找的场景中被广泛应用。
本文将介绍数组的二分法查找原理,深入阐述其优势,并探讨二分法查找在实际应用中的场景。
通过全面了解和掌握这一查找算法,可以使读者在实际问题中更加高效地进行查找操作。
1.2文章结构文章结构部分的内容可以包括以下内容:文章结构部分的主要目的是帮助读者了解整篇文章的组织和内容安排。
通过清晰的文章结构,读者可以更好地理解和掌握数组二分法查找的相关知识。
本文采用如下结构:1. 引言1.1 概述引言部分将介绍本文要讨论的主题——数组二分法查找的基本概念和原理。
通过引入问题的背景和重要性,读者可以更好地理解为什么需要数组二分法查找以及它的应用场景。
1.2 文章结构文章结构部分(即本节)将详细介绍本文的整体组织安排。
通过明确列出本文的各个部分和各部分的主要内容,读者可以清楚地了解到本文将要涵盖哪些内容和每部分的重点。
1.3 目的目的部分将概述本文的目标和意义。
通过明确说明本文的目的,读者可以更好地理解文章的价值和阅读的收获。
2. 正文正文部分将详细介绍数组二分法查找的基本概念、原理和算法。
本节将首先介绍数组的二分法查找的定义和基本思想,接着会详细解释二分法查找的原理及其实现方法。
php教程:二维数组二分查找需找数组中某一元素下标

php教程:二维数组二分查找需找数组中某一元素下标php教程:二维数组二分查找需找数组中某一元素下标成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。
以下的在PHP中二维数组二分查找需找数组中某一元素下标,希望对大家有所帮助,更多信息请关注!如果你的数组有特殊性:数组元素大小有序排序,这样的话,你应该用二分查找,因为它快速高效,特地写了一段如下:/***二分法寻找数组下标*@blog.phpddt.*/functionbinarySearch($array,$value){//起始位置,你可以作为函数参数$low=0;$high=count($array)-1;while($low<=$high){$mid=ceil(($low+$high)/2);if($array[$mid]==$value)return$mid;if($array[$mid]<$value){$low=$mid+1;}if($array[$mid]>$value){$high=$mid-1;}}return-1;}//thisisatest$a=array(1,3,5,7,8,12);echobinarySearch($a,8);//4>其实PHP中有个很好用的函数叫array_search()$array=array(0=>'blue',1=>'red',2=>'green',3 = >'red');$key=array_search('green',$array);echo$key;//2 >很轻松就返回数组下标了!。
二分法解决问题实例并描述处理的过程

二分法解决问题实例并描述处理的过程
二分法是一种常用的查找算法,它可以高效地在有序数组中查找特定的元素。
以下是一个使用二分法解决问题的实例,并描述了处理的过程:
问题:在有序整数数组中查找特定元素的索引。
输入:一个有序的整数数组 `arr` 和一个目标元素 `target`。
输出:如果目标元素 `target` 存在于数组 `arr` 中,则返回其索引值;否则,返回 -1。
1. 首先,初始化两个指针 `left` 和 `right`,分别指向数组的起始位置和结束位置。
2. 开始循环处理。
当 `left` 小于等于 `right` 时,执行以下步骤:
1. 计算指针 `mid`,它指向数组的中间位置,即 `mid = (left + right) / 2`。
2. 如果目标元素 `target` 等于数组中间位置的元素 `arr[mid]`,则返回 `mid`。
3. 如果 `target` 小于 `arr[mid]`,则将指针 `right` 更新为 `mid - 1`,缩小搜索范围。
4. 如果 `target` 大于 `arr[mid]`,则将指针 `left` 更新为 `mid + 1`,缩小搜索范围。
3. 如果循环结束条件为 `left > right`,说明目标元素不在数组中,返回 -1。
这个二分法的处理过程基于每次都将搜索范围缩小一半的原理,因此其时间复杂度为O(logN),其中 N 是数组的长度。
这种算法适用于已排序的数组和列表,可以高效地进行搜索操作。
PHP二分算法查找示例及详细分析

PHP二分算法查找示例及详细分析/*** 二分算法查找* @param array $array 要查找的数组* @param int $min_key 数组的最小下标* @param int $max_key 数组的最大下标* @param mixed $value 要查找的值* @return boolean*/function bin_search($array,$min_key,$max_key,$value){if($min_key <= $max_key){$key = intval(($min_key+$max_key)/2);if($array[$key] == $value){return true;}elseif($value < $array[$key]){return bin_search($array,$min_key,$key -1,$value);}else{return bin_search($array,$key+1,$max_key,$ value);}}else{return false;}}//现在我们来测试一下这个函数$array = array(1,22,23,45,58);$value = 45;$min_key = min(array_keys($array));$max_key = max(array_keys($array));if(bin_search($array,$min_key,$max_key,$value)){echo "Search Success!";}else{echo "Search Faliure!";}这里涉及到了两个知识点:首先是二分算法的概念:如下1、二分查找的先决条件:就是表中结点按关键字有序,且顺序(一维数组)存储.2、二分法思想:取中,比较(2.1)求有序表的中间位置mid(2.2)若r[mid].key == k,则查找成功,若r[mid].key > k,在左子表中继续进行二分查找;若r[mid].key < k,则在右字表中继续进行二分查找然后就是递归。
解析php二分法查找数组是否包含某一元素

解析php⼆分法查找数组是否包含某⼀元素⼆分法查找数组是否包含某⼀元素,兼容正反序,代码实现:复制代码代码如下:<?php$searchValue = (int)$_GET['key'];function search(array $array, $value){$max = count($array)-1;$min = 0;$isAscSort = $array[$min] < $array[$max];while (TRUE) {$sum = $min+$max;$midKey = (int)($sum%2 == 1 ? ceil($sum/2) : $sum/2);if ($max < $min) {return -1;} else if ($value == $array[$midKey]) {return 1;} else if ($value > $array[$midKey]) {$isAscSort ? $min = $midKey+1 : $max = $midKey-1;} else if ($value < $array[$midKey]) {$isAscSort ? $max = $midKey-1 : $min = $midKey+1;}}}$array = array('4', '5', '7', '8', '9', '10', '11', '12');// 正序echo search($array, $searchValue);// 逆序rsort($array);echo search($array, $searchValue);这个之前搜过,看过百度百科的例⼦(Java的实现),还有⼀些其他技术宅写的Code,都有问题,根本就没实现,这些⼈不测试就放出来误导⼈,⼤家可以去搜搜看下,昨天闲来⽆事就⾃⼰写⼀个分享给⼤家。
- 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