php查找之二分查找
二分查找,往往是针对有序的数组进行查找,我们假设一个序列是数组有序,然后给定一个数字,查出它应该在这个数组中的排序位置
百度百科中讲到
二分查找也称折半查找(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查找之二分查找相关推荐
- 【Java】 查找数组中指定元素之 顺序查找 与 二分查找
今天博主分享两个查找数组中指定元素的算法:顺序查找与二分查找 小小目录 1.顺序查找 2. 二分查找 1.顺序查找 给定一个数组, 再给定一个元素, 找出该元素在数组中的位置. 代码如下: //顺序查 ...
- 让你秒懂的折半查找(二分查找)
折半查找又称二分查找,只能适用于有序的顺序表. //折半查找 int Bsearch(int R[],int low,int high,int key){int min;while(low<=h ...
- 动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有
1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /**** ...
- 顺序查找与二分查找算法
顺序查找算法 顺序查找是非常简单常用的查找算法,基本思路:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1.该算 ...
- Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找
Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...
- 数据结构---顺序查找和二分查找
数据结构-顺序查找和二分查找 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> int n;//查找元素数组的长度 vo ...
- 线性查找法java代码_Java线性查找和二分查找
Java线性查找和二分查找. 一 线性查找 定义:在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程. 线性查找又称为顺序查找.如果查找池是某种类型的一个表,比如一个数组,简 ...
- 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找
第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...
- java数组线性查找_数组查找: 线性查找与二分查找
前言 从数组中查找你需要的数据,是一个很常见的需求,那么当你查找所需数据时,用什么方法查找速度最快? 本文将通过图文形式,详细讲解线性查找与二分查找,并用JavaScript将其实现,欢迎各位感兴趣的 ...
- 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例
介绍 这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找 有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看[文章目录] 配套视频自 ...
最新文章
- JavaScript初学者编程题(6)
- IT项目十大灾难(转载)
- luogu1991 无线通讯网
- 一个学中医女生的保养身体法
- Python检查特定值是否包含在列表中
- python都用什么写代码_python都用什么写代码
- 福建二级计算机考试12,福建农林大学2016年12月计算机二级考试通知
- python迭代器、生成器和yield语句
- Oracle数据泵对已经存在的表加载索引
- mysql高可用 MHA
- 攒机笔记二十二:台式组装机(2022.9)
- Python与SEO,搜狗站长平台网站提交POST源码
- 2.2析取范式与合取范式
- 宝塔面板安装云锁启用拦截功能全流程操作
- Elasticsearch(006):es中filtered和filter的区别
- 使用mysqldump+WinRAR压缩备份数据库
- 1-系统C盘迁移到新买的固态硬盘SSD中有影响但不主要,但有必要将系统盘C盘迁移到新安装的 固态硬盘SSD中吗?
- 计算机网络(综合应用题1)
- 基于BIM轻量化的智能建造OA管理系统
- HDU 4417 Super Mario(划分树问题求不大于k的数有多少)