search函数 php,PHP自定义函数完成二分查找实例(binary_search)

摘要:

最近在学习算法,本篇作自己学习二分查询的笔记,同时也分享给正在学习的朋友!

必要条件

想要完成二分查找这个算法,最要保证的两个前提就是:

(1)确保存有数据的数组为索引数组

(2)在第一个条件下,数组中的数据还需要是已经排序好的(小到大,大到小)

算法原理

6d27afabe8be213ce623efb1c485f47a.gif

原理:数组在排序后,每次都找该数组的某一段的中间项,并跟要找的目标进行“对比”

(1)如果刚好相等,则就算找出来了

(2)如果中间项比目标大,就只要去左边的那一半中找

(3)如果中间项比目标小,就只要去右边的那一半中找

演示实例代码

下面代码为演示数组的二分查找算法(递归方法):<?php

$arr1 = [2, 5, 8, 10, 15, 18, 22, 24, 24, 28, 33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70];

$search = 18; //具体分析,可以将该数据修改为不同的值,比如2,5,8

//假设有一个函数,它能够从某一个数组$arr中的某个下标范围($start---$end)中找到指定的数据$value

//这里,假设:$start一定不能大于$end,否则,我们就认为找不到了!

function binary_seach($arr, $value, $start, $end)

{

if ($start > $end) {

return false;

}

#往下取整(去小数)

$mid = floor(($start + $end) / 2);  //取得两个下标中的中间下标(一半)

$mid_value = $arr[$mid];  //中间项的值

#如果中间值是刚好找的值,就算找出来了

if ($mid_value == $value) {

return true;

}

#如果中间项比目标大,直就要去左边的那一半找

elseif ($mid_value > $value) {

$new_start = $start;

$new_end = $mid - 1;

return binary_seach($arr, $value, $new_start, $new_end);

}

# 如果中间项比目标小,就只要去右边的那一半中找

else {

$new_start = $mid + 1;

$new_end = $end;

return binary_seach($arr, $value, $new_start, $new_end);

}

}

$len = count($arr1); //数组长度

$result = binary_seach($arr1, $search, 0, $len - 1);

var_dump($result);

代码嵌笔记实例

下面代码为演示数组的二分查找算法(带笔记版本):<?php

//演示数组的二分查找算法:

//前提:

// 1,索引数组;

// 2,数组是已经排好序的了。

$arr1 = [2, 5, 8, 10, 15, 18, 22, 24, 24, 28, 33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70];

$search = 18; //具体分析,可以将该数据修改为不同的值,比如2,5,8

//原理:每次都找该数组的某一段的中间项,并跟要找的目标进行“对比”

//1,如果刚好相等,则就算找出来了

//2, 如果中间项比目标大,就只要去左边的那一半中找

//3, 如果中间项比目标小,就只要去右边的那一半中找

//假设有一个函数,它能够从某一个数组$arr中的某个下标范围($start---$end)中找到指定的数据$value

//这里,假设:$start一定不能大于$end,否则,我们就认为找不到了!

function binary_seach($arr, $value, $start, $end)

{

if ($start > $end) {

return false;

}

#往下取整(去小数)

$mid = floor(($start + $end) / 2);  //取得两个下标中的中间下标(一半)

$mid_value = $arr[$mid];  //中间项的值

#如果中间值是刚好找的值,就算找出来了

if ($mid_value == $value) {

return true;

}

#如果中间项比目标大,直就要去左边的那一半找

elseif ($mid_value > $value) {

$new_start = $start;

$new_end = $mid - 1;

return binary_seach($arr, $value, $new_start, $new_end);

}

# 如果中间项比目标小,就只要去右边的那一半中找

else {

$new_start = $mid + 1;

$new_end = $end;

return binary_seach($arr, $value, $new_start, $new_end);

}

}

$len = count($arr1); //数组长度

$result = binary_seach($arr1, $search, 0, $len - 1);

var_dump($result);

for语句版本

下面代码为for循环完成二分方法,原理都差不多:<?php

$arr1 = [2, 5, 8, 10, 15, 18, 22, 24, 24, 28, 33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70];

$search = 28; //具体分析,可以将该数据修改为不同的值,比如2,5,8

$result = bin_search($arr1, $search, 0, count($arr1) - 1);

var_dump($result);

function bin_search($arr, $value, $start, $end)

{

for ($i = 1; $i > 0; $i++) {

if ($start > $end) {

#最终只会剩下一个数值,如果依然不匹配,$start永远为1,$end永远为0

#如果在数组中没找到搜索的值,$start会大于$end,结束循环

return false;

}

#计算$start和$end的中间位置(floor函数去小数取整)

$mid = floor(($start + $end) / 2);

$mid_value = $arr[$mid];

#如果运气好刚刚好找到的中间值就是要找的值

if ($mid_value == $value) {

return true;

}

#中间值大于要找的目标值,则只要去中间值的左边找.

if ($mid_value > $value) {

$start = $start;

$end = $mid - 1;

} #中间值小于于要找的目标值,则只要去中间值的右边找.

elseif ($mid_value 

$start = $mid + 1;

$end = $end;

}

}

}

6d27afabe8be213ce623efb1c485f47a.gif

感谢您的支持,我会继续努力的!

6d27afabe8be213ce623efb1c485f47a.gif

扫码打赏,你说多少就多少

6d27afabe8be213ce623efb1c485f47a.gif

6d27afabe8be213ce623efb1c485f47a.gif

打开支付宝扫一扫,即可进行扫码打赏哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值