常见查找算法之php, js,python版

4 篇文章 0 订阅
3 篇文章 0 订阅

常用算法

>>>1. 顺序查找, 也叫线性查找, 它从第一个记录开始, 挨个进行对比, 是最基本的查找技术

javaScript :
// (线
// javaScript 
function  search ( data , needle )
{
     for ( var  i = 0 ; i < data . length ; i ++ )
     {
         if ( data [ i ]  ==  needle  &&  typeof  data [ i ]  ==  typeof  needle )
         {
              return  i ;
         }
     }
     return  false ;
}
 
var  data  =  [ 100 , 10 , 2 , 7 , 8 , 6 ] ;
console . log ( search ( data , 7 )) ; // 3
console . log ( search ( data , '7' )) ; // false

php版:

<?php
// php
function  search ( $data, $needle )
{
     $data_len  =  count ( $data );
     for ( $i = 0; $i < $data_len; $i ++ )
     {
         if ( $data [ $i ]  ===  $needle )  return  $i;
     }
     return  false;
}
 
$data  =  [ 100, 10, 2, 7, 8, 6 ];
var_dump ( search ( $data, 7 )); // int(3)
var_dump ( search ( $data, '7' )); // bool(false)



python3

# python3 
def  search ( data, needle ) :
     dataLen  =  len ( data )
     for  i  in  range ( dataLen ) :
         if  data [ i ]  ==  needle  and  type ( data [ i ])  ==  type ( needle ) :  return  i
     return  False
data  =  [ 100, 10, 2, 7, 8, 6 ]
print ( search ( data, 7 ))    # 3
print ( search ( data, '7' ))  # False
print ( search ( data, 6 ))    # 5


>>>

二分找查, 折半查找

核心思想:

1. 用low , high , middle 表示待查找区间的 下界, 上界,中间 的坐标

2. 取中间位置 middle = floor((low+high)/2)

3. 用给定值与 中间位置的值 作比较

等于: 查找成功

大于: 待查数据在区间的后半段  设low 为 middle+1

小于: 待查数据在区间的前半段  设high 为 middle-1

4.数据是排序好的

5.直到越界 (low>high) 查找失败, 结束





PHP版:

<?php
//   PHP
$data_list  =  [ 1, 2, 4, 5, 5, 6, 10, 12 ];
function  bisearch ( $data_list, $needle )
{
     $low  =  0;
     $high  =  count ( $data_list ) -1;
     if ( $data_list [ $low ]  ==  $needle )  return  $low;
     if ( $data_list [ $high ]  ==  $needle )  return  $high;
     while ( $high >= $low )
     {
         $middle  =  floor (( $low + $high )/ 2 );
         if ( $needle  ==  $data_list [ $middle ])
         {
              return  $middle;
         } elseif ( $needle > $data_list [ $middle ])
         {
              $low  =  $middle +1;
         } else {
              $high  =  $middle -1;
         }
     }
     return  false;
}
 
print_r ( bisearch ( $data_list, 10 ))// 6
print_r ( bisearch ( $data_list, 5 ));   // 3
print_r ( bisearch ( $data_list, 13 ))// false

截图:


python 3版 二分查找

import  math
# python3 
def  bisearch ( data_list, needle ) :
     low, high  =  0, len ( data_list ) - 1
     if  needle  ==  data_list [ low ] :   return  low
     if  needle  ==  data_list [ high ] :  return  high
     while  high >= low :
         middle  =  math. floor (( high + low ) / 2 )
         if  needle  ==  data_list [ middle ] :   return  middle
         elif  needle  >  data_list [ middle ] :  low  =  middle + 1
         else :  high  =  middle - 1
     return  False
 
data_list  =  [ 1, 2, 4, 5, 5, 6, 10, 12 ]
print ( bisearch ( data_list, 10 ));    # 6
print ( bisearch ( data_list, 5 ));     # 3
print ( bisearch ( data_list, 13 ));    # False
 

截图:


javaScript 版二分查找:

// js 
function  bisearch ( data_list , needle )
{
     var  low  =  0 , high  =  data_list . length -1
     if  ( needle  ==  data_list [ low ]  )  return  low
     if  ( needle  ==  data_list [ high ])  return  high
     while  ( high >= low )
     {
         var  middle  =  Math . floor (( low + high ) / 2 )
         if ( needle  ==  data_list [ middle ])
         {
              return  middle
         } else  if ( needle > data_list [ middle ])
         {
              low  =  middle  +  1
         } else {
              high  =  middle  -  1
         }
     }
     return  false
}
data_list  =  [ 1 , 2 , 4 , 5 , 5 , 6 , 10 , 12 ]
console . log ( bisearch ( data_list , 10 )) ;    // 6
console . log ( bisearch ( data_list , 5 )) ;     // 3
console . log ( bisearch ( data_list , 13 )) ;    // False

截图:



>>> 插值查找 (由二分查找改进)

二分查找的公式:

middle = (low+high)/2    => low+(1/2)*(high-low)

插值查找的公式由上面演变, 主要改进的是二分之一部分:

middle = low+((needle-data[low])/(data[high]-data[low]))*(high-low)


对二分查找跟插值查找的一个说明:

插值查找对于公布均匀的数据, 速度比二分查找快(插值查找次数少),例如对下面这类数据

$data = [1,2,3,6,7,9,10,11,...]

对于分布不均匀的数据, 二分查找要比插值查找快 例如下:

$data = [4,100,300,685,3452,...]

PHP版 插值查找算法:

<?php
// () PHP
$data_list  =  [ 1, 2, 4, 5, 5, 6, 10, 12 ];
function  interpolation ( $data_list, $needle )
{
     $low  =  0;
     $high  =  count ( $data_list ) -1;
     if ( $data_list [ $low ]  ==  $needle )  return  $low;
     if ( $data_list [ $high ]  ==  $needle )  return  $high;
     while ( $high >= $low )
     {
         $middle  =  floor ( $low + (( $needle - $data_list [ $low ])/ ( $data_list [ $high ] - $data_list [ $low ])) * ( $high - $low ));
         if ( $needle  ==  $data_list [ $middle ])
         {
              return  $middle;
         } elseif ( $needle > $data_list [ $middle ])
         {
              $low  =  $middle +1;
         } else {
              $high  =  $middle -1;
         }
     }
     return  false;
}
 
print ( interpolation ( $data_list, 10 ))// 6
print ( interpolation ( $data_list, 5 ));   // 3
print ( interpolation ( $data_list, 13 ))// false
 
$index  =  interpolation ( $data_list, 10 );
echo  $data_list [ $index ]; // 10

/*
 : 1.floor   6 float
      2.false print,echo 
*/

截图:


python3版 插值查找算法:

import  math
# python3 
def  interpolation ( data_list, needle ) :
     low, high  =  0, len ( data_list ) - 1
     if  needle  ==  data_list [ low ] :   return  low
     if  needle  ==  data_list [ high ] :  return  high
     while  high >= low :
         middle  =  math. floor (
              low +
              (( needle - data_list [ low ]) / ( data_list [ high ] - data_list [ low ])) *
              ( high - low )
         )
         if  needle  ==  data_list [ middle ] :   return  middle
         elif  needle  >  data_list [ middle ] :  low  =  middle + 1
         else :  high  =  middle - 1
     return  False
 
data_list  =  [ 1, 2, 4, 5, 5, 6, 10, 12 ]
print ( interpolation ( data_list, 10 ));    # 6
print ( interpolation ( data_list, 5 ));     # 3
print ( interpolation ( data_list, 13 ));    # False

截图:


js 版插值查找算法:

// js 
function  interpolation ( data_list , needle )
{
     var  low  =  0 , high  =  data_list . length -1
     if  ( needle  ==  data_list [ low ]  )  return  low
     if  ( needle  ==  data_list [ high ])  return  high
     while  ( high >= low )
     {
         var  middle  =  Math . floor (
              low + (( needle - data_list [ low ]) / ( data_list [ high ] - data_list [ low ])) *
              ( high - low )   
         )
         if ( needle  ==  data_list [ middle ])
         {
              return  middle
         } else  if ( needle > data_list [ middle ])
         {
              low  =  middle  +  1
         } else {
              high  =  middle  -  1
         }
     }
     return  false
}
data_list  =  [ 1 , 2 , 4 , 5 , 5 , 6 , 10 , 12 ]
console . log ( interpolation ( data_list , 10 )) ;    // 6
console . log ( interpolation ( data_list , 5 )) ;     // 3
console . log ( interpolation ( data_list , 13 )) ;    // False

截图:


小结:

以上有php,python,js 版常见的查找算法:

1. 顺序(线性) 查找

2. 二分查找 (折半查找)

3. 插值查找 (二分查找优化 适用于分布均匀的数据)

4. 前提是数据排好序, 顺序

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值