2014-09-05
在php中我们可以通过array_search()函数来查找一个数组内的元素值的键名.
同样,我们可以通过使用二分法来查找数组内的元素的键名.
那什么是二分法呢?
我来解释下:
如果数据是按升序排序的,我们从数据的中间位置开始查找,若给定的值恰好等于当前位置的值,查找成功,若给定的值小于当前位置的值,那我们就从以当前值为准查找其前半部分的值,反之,若给定的值大于当前值,那么就从以当前值为准查找其后半部分的值.
也就是说,利用二分法查找的数据,必须是排好序的.
下面我们尝试查找数组array(1,2,3,4,5,6,7,8,9,10)中的某一个值的位置:
<?php
function Search($a,$val){
$low = 0;
$high= count($a) - 1;
while($low <= $high){
$mid = intval(($low+$high)/2);
if($a[$mid] == $val)
return $mid;
if($a[$mid] > $val){
$high = $mid - 1;
}else{
$low = $mid + 1;
}
}
return -1;
}
?>
以上函数,第一个参数为传入的数组,第二个参数为该数组需要查询的值.
我们给数组的键设置一个最小值$low为0,设置一个最大值为$high为数组长度减一,那么中间值我们就可以设置为intval(($low+$height)/2),
也就是说,当数组元素长度为奇数时,数组的中间值正好在正中间,
例如数组长度为5,那中间值正好为2,也就是(0+4)/2,
0,1,2,3,4
那当我们的数组长度为偶数时,利用上述公式是无法除尽的,所以我们要取整,无论是进一法取整还是舍去法取整都是可以的
例如数组长度为6,那中间值为(0+5)/2,值为2.5,那数组中键为2.5的是不存在的,所以我们就需要取整为2
0,1,2,3,4,5
如果使用上述取整函数intval或者是floor函数获得的键为2,如果使用ceil取整,这里得到的键即为3
那么,我们拿上面的数组来说:
数组的长度为10,那么中间值即为intval((0+(10-1))/2),为4,索引为4的也就是数组中的第五个元素"5"
1,2,3,4,5,6,7,8,9,10
好,我们下面开始判断,
1.如果需要查询的值恰好为"5",查找成功,直接返回该值的索引即可.
也就是
if($a[$mid] == $val)
return $mid;
2.如果要查询的值小于"5",我们需要把$high的值设为中间值减一,即为4-1,并返回继续查询中间值的前半部分(红色部分)
1,2,3,4,5,6,7,8,9,10
即为:
if($a[$mid] > $val){
$high = $mid - 1;
}
3.如果要查询的值大于"5",我们就需要把$low的值设为中间值加一,即为4+1,并返回继续查询中间值的后半部分(红色部分)
1,2,3,4,5,6,7,8,9,10
即为:
else{
$low = $mid + 1;
}
设置完之后,返回继续查询,如果满足条件$low<=$high,就反复查询,直到此条件不成立,也就是被查询的范围小于一个数组元素时,说要查询的值在数组中不存在,返回-1
while($low <= $high){
.......
}
return -1;
此函数的缺点在于:
如果数组中有重复的值,只能查到其中的一个值的键,有兴趣的童鞋,可以对以上函数进行完善,跟帖回复.
摘自 zdrjlamp
1
CI框架连接数据库配置操作以及多数据库操作
09-05
2
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
05-17
3
C语言关键字及其解释介绍 C语言32个关键字详解
04-05
4
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
04-26
5
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
04-12
6
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
09-05
7
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
8
PHP中include和require区别之我见
09-05
常用dos命令及语法
2014-09-27
将视频设置为Android手机开机动画的教程
2014-12-11
php递归返回值的问题
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
java中的info是什么意思
2022-03-24
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
IcePHP框架中的快速后台中的通用CRUD功能框架
2014-09-05
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
PHP数组函数array
2014-09-05
学ug编程如何快速入门?
2022-03-17
英雄联盟云顶之弈手机版本下载v14.8.5768838 安卓最新版本
策略塔防 78.2M
下载苍蓝前线手游下载v1.1.0 安卓版
策略塔防 464.3M
下载崩坏学园2手游下载v12.2.8 安卓最新版本
角色扮演 323.3M
下载彩虹联萌手游下载v7.3.23015 安卓官方版
卡牌对战 804.7M
下载花花填色苹果版下载v2.2.5 iPhone版
其它手游 174M
下载奥特曼超时空英雄官方正版下载v1.0.2 安卓版
动作闯关 1.63G
下载全民奇迹2ios版下载v15.0.0 iphone版
其它手游 3G
下载罗布乐思roblox国际服最新版官方正版下载v2.682.538 安卓版
动作闯关 131.0M
下载com.roblox.client国际服下载v2.682.538 安卓版
下载
绝地鸭卫游戏下载v0.2.3 安卓版
下载
梦幻模拟战官服下载v6.13.2110 安卓最新版
下载
天龙八部手游8868版下载v1.133.2.2 安卓版
下载
天龙八部游戏下载v1.133.2.2 安卓手机版
下载
天龙八部手游果盘端下载v1.133.2.2 安卓版
下载
海贼王燃烧意志官方版下载v3.3.0.492700 安卓正版
下载
宝宝巴士安慰小宝宝下载v9.87.00.01 安卓版
下载