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

百度百科中讲到

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

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

我们举个例子看看

1 3 5 7 9 10 是已经排好序的数组,如果现在要求查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);

截图如下:

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

转载于:https://www.cnblogs.com/lizhaoyao/p/8611143.html

php查找之二分查找相关推荐

  1. 【Java】 查找数组中指定元素之 顺序查找 与 二分查找

    今天博主分享两个查找数组中指定元素的算法:顺序查找与二分查找 小小目录 1.顺序查找 2. 二分查找 1.顺序查找 给定一个数组, 再给定一个元素, 找出该元素在数组中的位置. 代码如下: //顺序查 ...

  2. 让你秒懂的折半查找(二分查找)

    折半查找又称二分查找,只能适用于有序的顺序表. //折半查找 int Bsearch(int R[],int low,int high,int key){int min;while(low<=h ...

  3. 动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

     1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /**** ...

  4. 顺序查找与二分查找算法

    顺序查找算法 顺序查找是非常简单常用的查找算法,基本思路:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1.该算 ...

  5. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

    Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...

  6. 数据结构---顺序查找和二分查找

    数据结构-顺序查找和二分查找 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> int n;//查找元素数组的长度 vo ...

  7. 线性查找法java代码_Java线性查找和二分查找

    Java线性查找和二分查找. 一 线性查找 定义:在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程. 线性查找又称为顺序查找.如果查找池是某种类型的一个表,比如一个数组,简 ...

  8. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

  9. java数组线性查找_数组查找: 线性查找与二分查找

    前言 从数组中查找你需要的数据,是一个很常见的需求,那么当你查找所需数据时,用什么方法查找速度最快? 本文将通过图文形式,详细讲解线性查找与二分查找,并用JavaScript将其实现,欢迎各位感兴趣的 ...

  10. 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例

    介绍 这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找 有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看[文章目录] 配套视频自 ...

最新文章

  1. JavaScript初学者编程题(6)
  2. IT项目十大灾难(转载)
  3. luogu1991 无线通讯网
  4. 一个学中医女生的保养身体法
  5. Python检查特定值是否包含在列表中
  6. python都用什么写代码_python都用什么写代码
  7. 福建二级计算机考试12,福建农林大学2016年12月计算机二级考试通知
  8. python迭代器、生成器和yield语句
  9. Oracle数据泵对已经存在的表加载索引
  10. mysql高可用 MHA
  11. 攒机笔记二十二:台式组装机(2022.9)
  12. Python与SEO,搜狗站长平台网站提交POST源码
  13. 2.2析取范式与合取范式
  14. 宝塔面板安装云锁启用拦截功能全流程操作
  15. Elasticsearch(006):es中filtered和filter的区别
  16. 使用mysqldump+WinRAR压缩备份数据库
  17. 1-系统C盘迁移到新买的固态硬盘SSD中有影响但不主要,但有必要将系统盘C盘迁移到新安装的 固态硬盘SSD中吗?
  18. 计算机网络(综合应用题1)
  19. 基于BIM轻量化的智能建造OA管理系统
  20. HDU 4417 Super Mario(划分树问题求不大于k的数有多少)

热门文章

  1. Docker详解(三)——Docker安装与部署
  2. Linux VIM编辑器详解
  3. 实现二叉树的遍历(递归与非递归)
  4. laravel后台可修改配置自动加载
  5. [转]OOPC:Object-Oriented Programming in C
  6. everything is tools!
  7. ubuntu mysql远程连接
  8. 用sqoop从mysql导数hive_使用sqoop从mysql导入到hive基本操作
  9. 文件上传下载——sz和rz
  10. java程序如何执行jar包_java程序如何打包成可执行jar包?