温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据结构之查找(php代码实现)

发布时间:2020-06-10 12:31:52 来源:网络 阅读:492 作者:great_yonchin 栏目:web开发
/**
 * Search_Seq($arr,$elem):顺序查找
 * Search_Seq2($arr,$elem):顺序查找(优化)
 * Search_bin($arr,$elem):二分查找
 * SearchBST($elem):二叉搜索
 */
class Search{
    public $arr;

    function __construct($arr)
    {
        $this->arr = $arr;
    }


    /**
     * 顺序查找
     * @param $arr  在$arr数组中查找
     * @param $elem 查找数组中是否有存在元素$elem,有则返回在数组中的位置;没有则返回0
     */
    public static function Search_Seq($arr,$elem){
        for($i=0;$i<count($arr);$i++) {
            if($arr[$i]==$elem){
                return $i;
            }
        }
        return 0;
    }
    //此算法是对上面算法的一种优化
    public static function Search_Seq2($arr,$elem){
        $i=0;
        while($arr[$i]!=$elem){
            $i++;
        }
        return $i;
    }

    /**
     * 二分查找(也叫做折半查找),前提是数组必须有序——从小到大排列
     * @param $arr  在$arr数组中查找
     * @param $elem 查找数组中是否有存在元素$elem,有则返回在数组中的位置;没有则返回0
     */
    public static function Search_bin($arr,$elem){
        $low=0;
        $high=count($arr);
        while($low<=$high){
            $mid=round(($low+$high)/2);
//            $mid=$low+($low+$high)*($elem-$arr[$low])/($arr[$high]-$arr[$low]); //若将$mid的值改为此句,则就成了插值查找了。这种查找算法在数据大小分布比较均匀的时候,效率会比折半查找高一些。
            if($elem<$arr[$mid]){
                $high=$mid-1;
            }else if($elem>$arr[$mid]){
                $low=$mid+1;
            }else{
                return $mid;
            }
        }
        return 0;
    }


    /**
     * 二叉排序树
     * @param $elem
     * @return int
     */
    public function SearchBST($elem){
       return $this->find($this->arr[0],$elem,0);
    }
    private function find($root,$elem,$i){
        if($i>count($this->arr) || !$root){
            return 'Error';
        }
        if($elem==$root){
            return $i;
        }
        if($elem<$root && $i*2+1<count($this->arr)){
            return  $this->find($this->arr[$i*2+1],$elem,$i*2+1);
        }else if($elem>$root && $i*2+2<count($this->arr)){
            return  $this->find($this->arr[$i*2+2],$elem,$i*2+2);
        }
        return 0;
    }
}


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI