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

/**
 * 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;
    }
}
时间: 2024-10-25 16:47:04

数据结构之查找(php代码实现)的相关文章

数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找.本篇博客会给出相应查找算法的示意图以及相关代码,并且给出相应的测试用例.当然本篇博客依然会使用面向对象语言Swift来实现相应的Demo,并且会在github上进行相关Demo的分享. 查找在生活中是比较常见的,本篇博客所涉及的这几种查找都是基于线性结构的查找.也就是说我们的查找表是一个线性表,我

数据结构之图的代码实现(使用Python实现)

图的数据结构Python代码实现 使用邻接列表实现. 邻接表理论介绍 : 数据结构(八):邻接表与邻接矩阵 代码数据结构图示 数据结构文字描述 Graph().self.vertList : { key:Vertext(){ self.id = key self.connectedTo{ 相邻节点类实例 : 权重 .. .. } }, key2:Vertext(){ self.id = key self.connectedTo{ 相邻节点类实例 : 权重 .. .. } } .. } 代码实现

数据结构之队列c代码实现

一学期的数据结构,总不能毫无收获吧,因为书上的很多代码并不能实现,我一个编程小白可怎么过呢,难得假期有时间,于是我寻求度娘,从四面八方找了些可以编译通过的源码,这一次是队列,后面我还会逐渐补充,如果有什么差错,欢迎大佬们来留言啊. 交一下代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define QUEEN_SIZE 50 4 5 typedef struct SeqQueue 6 { 7 int data[QUEEN_SIZE];

二分查找 java代码

二分查找的前提是:你得先排好序,但是排序问题不在讨论. 直接上代码: import java.util.Optional; public class MyArray { public static void main(String[]args) { int[] arr = new int[]{1,2,3}; for (int i = 0; i < arr.length; i++) { System.out.println("arr[" + i + "]=" +

数据结构 - 静态查找

查找 主要讨论顺序表.有序表.索引表和哈希表查找的各种实现方法,以及相应查找方法在等概率情况下的平均查找长度. 查找表(Search Table):相同类型的数据元素(对象)组成的集合,每个元素通常由若干数据项构成. 关键字(Key,码):数据元素中某个(或几个)数据项的值,它可以标识一个数据元素.若关键字能唯一标识一个数据元素,则关键字称为主关键字(Primary Key) :将能标识若干个数据元素的关键字称为次关键字(Secondary Key) . 查找/检索(Searching):根据给

[数据结构] 二分查找与变种二分查找

1.二分查找 二分搜索(binary search),也称折半搜索(half-interval search).对数搜索(logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半. 除直接在一个数组

在Android源码中查找Java代码中native函数对应的C++实现

Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码: static native Thread currentThread(); 如何根据方法名找到其对应的C++实现,有两个方法. 先来个java代码的示例VMThread.java: package java.lang; class VMThread { Thread thread; int vmData; VMThread(Thread t) { thread = t; } native

数据结构:查找

1.学习总结 1.1查找的思维导图 1.2.查找学体会 (1)理解查找的基本概念,包括静态查找表和动态查找表.内查找和外查找之间的差异以及平均查找长度等. (2)重点掌握线性表上各种查找算法,包括顺序查找.折半查找和分块查找的基本思路.算法实现和查找效率等. (3)掌握各种树表的查找算法,包括二叉排序树.AVL树.B-树和B+树的基本思路.算法实现和查找效率等. (4)掌握哈希表查找技术以及哈希表与其他存储方式的本质区别. (5)灵活运用各种查找方法解决一些综合应用问题. 2.PTA实验作业 2

数据结构【查找】—平衡二叉树AVL

/*自己看了半天也没看懂代码,下次再补充说明*/ 解释: 平衡二叉树(Self-Balancing Binary Search Tree 或Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 实现原理: 平衡二叉树构建的基本思想就是在构建二又排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树.在保持二又排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关