1.顺序查找 -
就是遍历数组一个一个进行判断如果相等表示找到 退出即可
- /**
- * 数组顺序查找某值
- * @param array $arr 要检索的数组
- * @param integer $need 要查询的数
- * @return integer 找到返回该数下标 失败返回false
- */
- function gener_search($arr,$need){
- foreach ($arr as $k => $v) {
- //如果找到 返回该数小标
- if ($need === $v) {
- return $k;
- }
- }
- //没找到返回false
- return false;
- }
二分查找又称折半查找,
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表
二分查找采用的方法比较容易理解,以数组为例:
① 先取数组中间的值floor((low+top)/2),
② 然后通过与所需查找的数字进行比较,若比中间值大,则将首值替换为中间位置下一个位置,继续第一步的操作;若比中间值小,则将尾值替换为中间位置上一个位置,继续第一步操作
③ 重复第二步操作直至找出目标数字
比如从1,3,9,23,54 中查找数字23,
首位置为0, 尾位置为4,中间位置就为2 值为9,比23小,则首位置更新为2+1即3;那么接下来中间位置就为(3+4)/2=3,值为23,比较相等即找
- <?php
- //二分查找法
- function binSearch($arr,$search){
- $height=count($arr)-1;
- $low=0;
- while($low<=$height){
- $mid=floor(($low+$height)/2);//获取中间数
- if($arr[$mid]==$search){
- return $mid;//返回
- }elseif($arr[$mid]<$search){//当中间值小于所查值时,则$mid左边的值都小于$search,此时要将$mid赋值给$low
- $low=$mid+1;
- }elseif($arr[$mid]>$search){//中间值大于所查值,则$mid右边的所有值都大于$search,此时要将$mid赋值给$height
- $height=$mid-1;
- }
- }
- return "查找失败";
- }
- //二分查找递归实现
- function binSearch2($arr,$low,$height,$k){
- if($low<=$height){
- $mid=floor(($low+$height)/2);//获取中间数
- if($arr[$mid]==$k){
- return $mid;
- }elseif($arr[$mid]<$k){
- return binSearch2($arr,$mid+1,$height,$k);
- }elseif($arr[$mid]>$k){
- return binSearch2($arr,$low,$mid-1,$k);
- }
- }
- return -1;
- }
- $arr=array(1,2,3,4);
- echo binSearch($arr,4).'<br/>';
- echo binSearch2($arr,0,4,4).'<br/>';
- echo in_array(4,$arr).'<br/>';
- echo array_search(4,$arr);
3、斐波那契数列:
1 1 2 3 5 8 13 21 34 55 …
概念:
前两个值都为1,该数列从第三位开始,每一位都是当前位前两位的和
规律公式为:
Fn = F(n-1) + F(n+1)
F:指当前这个数列
n:指数列的下标
非递归写法:
function fbnq($n){ //传入数列中数字的个数
if($n <= 0){
return 0;
}
$array[1] = $array[2] = 1; //设第一个值和第二个值为1
for($i=3;$i<=$n;$i++){ //从第三个值开始
$array[$i] = $array[$i-1] + $array[$i-2];
//后面的值都是当前值的前一个值加上前两个值的和
}
return $array;
}
递归写法:
function fbnq($n){
if($n <= 0) return 0;
if($n == 1 || $n == 2) return 1;
return fbnq($n - 1) + fbnq($n - 2);
}