问题:对于一列有序数组,如何判断给出的一个值,该值是否存在于数组。
思路:判断是否存在,最简单是,直接循环该数组,对每一个值进行比较。但是对于有序数组来说,这样写就完全没有利用好“有序”这一特点。
所有我们使用到“二分法查找”,
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//有序数组为
$arr = array (2,5,66,87,954,1452,5865);
//查找值
$str = 1452;
//我们先定义 三个参数
$front = 0; //一个开始值下标
$end = count ( $arr ) - 1; //一个结束值下标
$mid = intval (( $front + $end ) / 2); //中间值下标
|
1、第一次比较,我们直接判断查找值str是否等于中间值mid,如果等于 直接返回 true;
2、如果查找值str大于中间值mid,则说明查找值str可能在中间值的右边,即对开始值front需重新赋值 = 中间值mid + 1,结束值end不用变,依次中间值mid为新的开始值 + 结束值;
3、如果查找值str小于中间值mid,则说明查找值str可能在中间值的左边,即开始值不用变,结束值end需重新赋值 = 中间值 – 1,依次中间值mid为开始值 + 新的结束值;
—–如上,对于传入的开始值,结束值,中间值,进行比较。一旦开始值 大于 结束值 则说明没有找到,结束查询,反之等于就返回已找到。
具体代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
$str = 89; //查找值
$arr = [1,55,66,89,420]; //有序数组
$ren = find( $arr , $str );
echo '<pre>' ;
var_dump( $ren );
function find( $arr , $str ){
$front = 0; //开始下标
$end = count ( $arr ) - 1; //结束下标
while ( $front <= $end ){ //结束值 大于 开始值 ,反之则退出
$mid = intval (( $front + $end ) / 2); //中间值下标
if ( $str == $arr [ $mid ]){
return $mid ; //存在直接返回值的下标
}
if ( $str > $arr [ $mid ]){
$front = $mid + 1; //在前面
}
if ( $str < $arr [ $mid ]){
$end = $mid - 1; //在后面
}
}
return false;
}
|
返回结果:89为第四个元素值下标3
int(3)
以上就是PHP查找一列有序数组是否包含某值(二分查找)的详细内容,如果有任何补充可以联系快网idc小编。
原文链接:https://www.php.cn/php-weizijiaocheng-442205.html
相关文章
猜你喜欢
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-06-04 90
-
2025-05-25 80
-
2025-05-25 43
-
mybatis 查询sql中in条件用法详解(foreach)
2025-05-29 92 -
2025-05-27 61
热门评论