PHP 二分法查找数据
作者:会飞的
不论在PHP中还是在其他的编程语言中,使用顺序法查找数据都面临着一个很大的问题,那就是:如果数组中的数据很多时,该怎么办?
继续使用顺序法查找数据会使得PHP的效率变低。
这时我们引入了二分法查找数据。
二分法就是在PHP的数组中假象数组排好序了,然后通过对数组元素的比较得到结果。比较一次就会排出1/2的数组。
例如:
<?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
{
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:xampphtdocsphpTest8.5.2.php on line 29 and defined in E:xampphtdocsphpTest8.5.2.php on line 3
Warning: Missing argument 4 for Dichotomy(), called in E:xampphtdocsphpTest8.5.2.php on line 29 and defined in E:xampphtdocsphpTest8.5.2.php on line 3
4
这是我第一次做的时候呈现的错误。问题出在哪里呢?
好吧:新手问题。因为在函数刚开始没有给$low和$max赋值,使得函数的if没有办法进行。
正确的代码如下:
<?php
//函数名称为Dichotomy,$php为数组,$k为要查找的值,$low为最小的值,$max为最大值
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;
}
else if($k < $php[$mid])
{
return Dichotomy($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开始查找。
这样我们会想:天下哪里有这么便宜的事,谁实现知道所有的数组呢。所以,这种方法也不是很方便。
那么,你有什么建议呢?
猜你喜欢
您可能感兴趣的文章:
- 网站优化知识手册:链接篇
- 网站优化中,链接就像填不满的黑洞
- 网站优化中如何选择链接锚文本
- 为什么网站优化是必要的网络营销方式
- 为什么要选择做网站优化
- 无形的网站优化
- 一个网站优化项目需要做哪些工作
- 站点地图与网站优化 网站地图的四个好处
- 做好整站优化才是真正的网站优化
- 做搜索引擎优化其实不单单考虑搜索引擎的算法
- ISSET()、empty()、is_numeric()的使用方法
- 排序算法
- 40个技巧优化您的PHP代码
- Access to the requested object is only available from the local network.
- ISSET()、empty()、is_numeric()使用方法
- ob_get_contents() 函数的用法
- PHP OOP思想
- PHP XML Expat 解析器
- php 读取xml