当前位置: 代码迷 >> 综合 >> PHP第六天 数组查找算法
  详细解决方案

PHP第六天 数组查找算法

热度:83   发布时间:2023-10-11 03:13:20.0

 

<?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 = 3;	//具体分析,可以将该数据修改为不同的值,比如:2, 5, 8,
//原理:每次都找该数组的某一段的中间项,并跟要找的目标进行“对比”
//1,如果刚好相等,则就算找出来了
//2, 如果中间项比目标大,就只要去左边的那一半中找
//3, 如果中间项比目标小,就只要去右边的那一半中找//假设有这么一个函数,它能够从某个数组$arr中的某个下标范围($start---$end)中找指定的数据$value
//这里,假设:$start一定是不能大于$end,否则,我们就认为找不到了!
function  binary_search($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_search($arr, $value, $new_start, $new_end);}//如果中间项比目标小,就只要去右边的那一半中找else{$new_start = $mid+1;$new_end = $end;return binary_search($arr, $value, $new_start, $new_end);}}
$len = count($arr1);
$result = binary_search($arr1,$search, 0, $len-1);
var_dump($result);
<?php
function binary_search($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){ //当中间数 大于 值$newstart = $start;$newend	  = $mid-1;return binary_search($arr,$value,$newstart,$newend);}else{//当中间数 小于 值$newstart = $mid+1;$newend   = $end;return binary_search($arr,$value,$newstart,$newend);}
} 
$arr1 = range(3,100);//生成0-100的数组
$len = count($arr1);
$search = 1;
$result = binary_search($arr1,$search, 0, $len-1);
var_dump($result);

数组查找算法

查找算法,就是从一个数组中,找一个“目标”(可以是值,也可以是键)的算法。

数组的查找函数:

in_array() :在一个数组中找是否存在某个数据。

array_search() : 在数组中搜索给定的值,如果成功则返回相应的键名

array_key_exists() : 检查给定的键名或索引是否存在于数组中

 

一种查找算法:

遍历查找:不值得一提!

 

      1. 二分查找:

此查找算法针对的数组有以下条件:

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 = 3; //具体分析,可以将该数据修改为不同的值,比如:2, 5, 8,

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

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

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

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

 

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

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

function  binary_search($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_search($arr, $value, $new_start, $new_end);

}

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

else

{

$new_start = $mid+1;

$new_end = $end;

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

}

 

}

$len = count($arr1);

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

var_dump($result);

 

 

 

 

 

 

 

  相关解决方案