二分查找,往往是针对有序的数组进行查找,我们假设一个序列是数组有序,然后给定一个数字,查出它应该在这个数组中的排序位置

百度百科中讲到

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列

折半查找这个名字一听,你就知道是怎么回事了。

我们举个例子看看

是已经排好序的数组,如果现在要求查X,我们如何查出X放在哪个位置呢?

很显然,我们可以取最中间的那个,然后假如找不到,就看中间的那个是大于X还是小于X 如果小于X,说明X应该在后半部分,如果是大于X,则说明在前半部分,那么此时,再以当前中间节点为起始或者终止节点组成新数组,再次查找,如此往返,总能找到X的位置。

还是直接看代码吧,最简单的方式,递归实现,代码如下:

<?php
function binary_search($array,$target,$start,$end)
{
$middle_index = floor(($start+$end)/2); // 定位中间位置的索引
$middle_value = $array[$middle_index];//取得中间项的值
if($middle_value == $target)
{
return $middle_index;
}else if($middle_value >$target)
{
if($start > $middle_index-1)//如果开始位置都比结束位置大了,表示肯定找不到了
{
return false;
}
//中间项比要找的目标大 就去左边找吧
$re = binary_search($array,$target,$start,$middle_index-1);
}else
{
if($middle_index+1 > $end)//如果开始位置比结束位置大了 表示肯定找不到了
{
return false;
}
//中间项比要找的目标小 就去右边找吧;
$re = binary_search($array,$target,$middle_index+1,$end);
}
return $re;
}
$array = array(1,3,5,7,9,10);
$search = 9;//要找的数
$index = binary_search($array,$search,0,count($array)-1);
var_dump($index);

截图如下:

我们可以看到,使用递归方式的理解是非常简单的,将大事化小,小事化了,如此往复来解决,分段分块,逐步查找得到改元素,如果找不到 返回false。

那么由于递归一直都是被认为是效率不高的,如何使用其他方式改写一下这样的查找方式呢?

我们可以用while循环实现迭代的方式来实现,代码如下:

<?php
function binary_search($array,$target,$start,$end)
{
$middle_index=floor(($start+$end)/2);
while($start<=$end)
{
//说明还能继续寻找
if($array[$middle_index]==$target)
{
//找到了
return $middle_index;
}elseif($array[$middle_index]>$target)
{
//说明中间元素大于目标元素 在前半部分
$end=$middle_index-1;//终止位置从刚刚找到的中间位置的左边那个位置结束
$middle_index=floor(($start+$end)/2);//重新计算中间位置
}else
{
//说明中间元素小于目标元素 在前半部分
$start=$middle_index+1;//起始位置中刚刚找到的中间位置的右边那个位置开始
$middle_index=floor(($start+$end)/2);//重新计算中间位置
}
}
return false;//找不到 返回false
}
$array = array(1,3,5,7,9,10);
$search = 9;//要找的数
$index = binary_search($array,$search,0,count($array)-1);
var_dump($index);

截图如下:

这样的话,循环次数也少了,改写了递归,降低了计算的复杂度。

php查找之二分查找的更多相关文章

  1. Java中常用的查找算法——顺序查找和二分查找

    Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...

  2. List<T>线性查找和二分查找BinarySearch效率分析

    今天因为要用到List的查找功能,所以写了一段测试代码,测试线性查找和二分查找的性能差距,以决定选择哪种查找方式. 线性查找:Contains,Find,IndexOf都是线性查找. 二分查找:Bin ...

  3. Java基础知识强化60:经典查找之二分查找

    1. 二分查找       二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 比较 ...

  4. C语言查找算法之顺序查找、二分查找(折半查找)

    C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...

  5. Java顺序查找、二分查找

    Java顺序查找.二分查找   查找算法中顺序查找算是最简单的了,无论是有序的还是无序的都可以,只需要一个个对比即可,但其实效率很低. 顺序查找 动图演示 详细代码 // 顺序查找 public st ...

  6. 【PHP数据结构】线性查找与二分查找

    欢迎来到查找的世界,在学习完各种数据结构之后,总算走到了这一步,不知道大家有什么感想呢?反正我是边学边忘,现在让我去说说图的那几个算法还是在蒙圈的状态中.不过学习嘛,就是一步一步的来,暂时搞不懂的东西 ...

  7. 各种查找算法的选用分析(顺序查找、二分查找、二叉平衡树、B树、红黑树、B+树)

    目录 顺序查找 二分查找 二叉平衡树 B树 红黑树 B+树 参考文档 顺序查找 给你一组数,最自然的效率最低的查找算法是顺序查找--从头到尾挨个挨个遍历查找,它的时间复杂度为O(n). 二分查找 而另 ...

  8. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  9. 数组查找算法的C语言 实现-----线性查找和二分查找

    线性查找  Linear Search 用户输入学生学号的成绩 二分查找  Binary Search 要求数据表是已经排好序的 程序存在小的瑕疵

  10. python---顺序查找,二分查找

    比较熟悉了. 但要注意细节, 二分查找时,普通方法mid处理,递归时,mid处理. # coding = utf-8 def sequential_search(a_list, item): pos ...

随机推荐

  1. 彻底清除Github上某个文件以及历史

    注意:如下操作会删除选中的文件以及历史记录,若你想保留最新版本的记录,请做好备份. cd进入到你的本地项目文件夹,然后依次执行下面6行命令即可: git filter-branch --force - ...

  2. office2016选择性安装

    office2016在安装的时候并不像之前的版本有选择性的安装,安装器会安装一个office全家桶.那么如何自主选择安装自己需要的工具呢? 微软在下载中心中提供了Office2016部署工具(Offi ...

  3. mtrace检查内存泄漏

    内存泄漏检查方法(for Linux) 如果你更想读原始文档, 请参考glibc info的"Allocation Debugging" 一章 (执行info libc);glib ...

  4. About darwin OS

    Darwin 是一种Unix-like操作系统,整合数种的技术,包含开 Darwin LOGO 放原始码的XNU核心,一种以微核心为基础的核心架构来实作Machkernel.操作系统的服务和userl ...

  5. unity--------shader之standard 标准参数

    [Unity3D自学记录]Unity5 之 standard参数 标签: unity3d 2016-07-13 10:17 2428人阅读 评论(0) 收藏 举报  分类: Unity3D(70)   ...

  6. 认识J2EE规范或标准以及J2EE和JEE有什么不同?

    1. J2EE实际上是一组规范(新手对规范这个词可能云里雾里的,没有办法,JAVA概念太多了,大部分概念慢慢就会理解),没错,J2EE这个概念并不是某种技术,而是一堆规范(实现意义上可以说是一堆技术) ...

  7. android中清空一个表---类似truncate table 表名 这样的功能 android sqlite 清空数据库的某个表

    public void clearFeedTable(){ String sql = "DELETE FROM " + FEED_TABLE_NAME +";" ...

  8. Linux set unset命令

    Linux  unset命令: 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh.ksh.bash等)和C shell家族(csh.tcsh等)都有实现. ...

  9. Sql Server数据库监听 c#代码

    using AnfiniL.SqlServerTools.Data; using SqlServerTools; using SqlServerTools.Data; using System; us ...

  10. 创建 React-Native 工程时,如何指定特定的 React-Native 版本

    react-native 可能会出现一种情况,就是版本最高的可能出现有些东西不太稳定,这时候要用到旧的版本怎么办?就可以用以下方法创建项目. 0. 原因 创建新的 React-Native (以下简称 ...