查找算法

1.顺序查找 -

  就是遍历数组一个一个进行判断如果相等表示找到 退出即可

[php]  view plain  copy
  1.  /** 
  2.  * 数组顺序查找某值 
  3.  * @param  array   $arr  要检索的数组 
  4.  * @param  integer $need 要查询的数 
  5.  * @return integer       找到返回该数下标 失败返回false 
  6.  */  
  7. function gener_search($arr,$need){  
  8.     foreach ($arr as $k => $v) {  
  9.         //如果找到 返回该数小标  
  10.         if ($need === $v) {  
  11.             return $k;  
  12.         }  
  13.     }  
  14.     //没找到返回false  
  15.     return false;  
  16. }  
2.二分查找 -
  二分查找又称折半查找,
  优点是比较次数少,查找速度快,平均性能好;
  其缺点是要求待查表为有序表,且插入删除困难。

  因此,折半查找方法适用于不经常变动而查找频繁的有序列表

二分查找采用的方法比较容易理解,以数组为例:

① 先取数组中间的值floor((low+top)/2),

② 然后通过与所需查找的数字进行比较,若比中间值大,则将首值替换为中间位置下一个位置,继续第一步的操作;若比中间值小,则将尾值替换为中间位置上一个位置,继续第一步操作

③ 重复第二步操作直至找出目标数字

比如从1,3,9,23,54 中查找数字23,

首位置为0, 尾位置为4,中间位置就为2 值为9,比23小,则首位置更新为2+1即3;那么接下来中间位置就为(3+4)/2=3,值为23,比较相等即找

[php]  view plain  copy
  1. <?php  
  2. //二分查找法  
  3. function binSearch($arr,$search){  
  4.     $height=count($arr)-1;  
  5.     $low=0;  
  6.     while($low<=$height){  
  7.         $mid=floor(($low+$height)/2);//获取中间数  
  8.         if($arr[$mid]==$search){  
  9.             return $mid;//返回  
  10.         }elseif($arr[$mid]<$search){//当中间值小于所查值时,则$mid左边的值都小于$search,此时要将$mid赋值给$low  
  11.             $low=$mid+1;  
  12.         }elseif($arr[$mid]>$search){//中间值大于所查值,则$mid右边的所有值都大于$search,此时要将$mid赋值给$height  
  13.             $height=$mid-1;  
  14.         }  
  15.     }  
  16.     return "查找失败";  
  17. }   
  18. //二分查找递归实现  
  19. function binSearch2($arr,$low,$height,$k){  
  20.     if($low<=$height){  
  21.         $mid=floor(($low+$height)/2);//获取中间数  
  22.         if($arr[$mid]==$k){  
  23.             return $mid;  
  24.         }elseif($arr[$mid]<$k){  
  25.             return binSearch2($arr,$mid+1,$height,$k);  
  26.         }elseif($arr[$mid]>$k){  
  27.             return binSearch2($arr,$low,$mid-1,$k);  
  28.         }  
  29.     }  
  30.     return -1;  
  31. }  

  32. $arr=array(1,2,3,4);  
  33. echo binSearch($arr,4).'<br/>';  
  34. echo binSearch2($arr,0,4,4).'<br/>';  
  35. echo in_array(4,$arr).'<br/>';  
  36. 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值