数据结构查找算法

查找算法

  • 查找表是由同一类型的数据元素构成的集合。
  • 静态查找表和动态查找表:
    • 静态查找表:在查找表中只做查找操作,而不改动表中的数据元素
    • 动态查找表:在查找表中做查找操作的同时还进行插入数据和删除数据的操作
  • 平均查找长度(SAL):查找成功时,查找的关键字和查找表中的数据元素中进行过比较的个数的平均值
    • 对于具有 n 个数据元素的查找表,查找成功的平均查找长度的计算公式为:

 

  • Pi 为第 i 个元素被查找的概率;Ci 表示在查找第 i 个元素之前已经进行过比较的次数

1、顺序查找算法

  • 顺序查找适合于存储结构为顺序存储或链接存储的线性表
  • 基本思想:顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。
  • 时间复杂度为O(n)
//基本思路:用顺序结构存储数据(数组、链表),从前到后依次查询目标值;
//查找num在数组arr中的位置,如果存在返回其位置(下标),若不存在则返回-1
public int findBySeq(int[] arr, int num){
    for(int i  = 0; i < arr.length; i++){
        if(arr[i] == num)
            return i;
    }
    return -1;
}

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

  • 该算法的使用的前提是静态查找表中的数据必须是有序的
  • 基本思想:属于有序查找算法。用给定值 k 先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据 k 与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
  • 时间复杂度为O(log2n)
//基本思路:将排序好的数据存放到数组里(不能是链表);将需要查找的元素与中间元素比,若小于就将原数组变为
//前半段,反之则为后半段(以升序为例);进行循环比较直至找到,或循环结束。
public int binSearch(int[] arr, int num){
    int left = 0;
    int right = arr.length-1;
    int mid;
    while(left <= right){
        mid = (left + right)/2;
        if(num > arr[mid])
            left = mid + 1;
        else if(num < arr[mid])
            right = mid -1;
        else
            return mid;
    }
    return -1;
}

3、插值查找

在实际问题中,每次查询不一定要折半,可能你已经知道要查的数据在偏前面或者后面的位置,这个时候再每次折半查找显然是浪费时间的,所以我们要改为自适应的。

二分查找中查找点的计算为:

因此我们可以将查找点改进为:

  • 基本思想:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找。
  • 注:对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。
  • 时间复杂度为为O(log2(log2n))
public int insertSearch(int[] arr, int num){
    int left = 0;
    int right = arr.length-1;
    int mid;
    while(left <= right){
        mid = left + (num - arr[left])/(arr[right] - arr[left]) * (right - left);
        if(num > arr[mid])
            left = mid + 1;
        else if(num < arr[mid])
            right = mid -1;
        else
            return mid;
    }
    return -1;
}

4、树表查找

  1. 二叉查找树(二叉排序树)
  2. 平衡二叉树
  3. 红黑树
  4. B-树
  5. B+树

5、分块查找(索引顺序查找)

属于顺序查找的一种改进方法

  • 算法思想:将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……
  • 实现方法:
  1. 建立一个索引表,把每块中的最大关键字值和每块的第一个元素在表中的位置和最后一个元素在表中的位置存放在索引项中。
  2. 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。
  • 优缺点:
    • 优点:适用范围大,顺序存储和连式存储都适用;查找效率高
    • 缺点:需要将待查表分块排序,并且要增加一个存储空间用来存储索引表

6、哈希查找

哈希查找

关于哈希表的详讲:http://c.biancheng.net/view/3437.html

  • 哈希函数:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。
  • 算法流程:
  1. 用给定的哈希函数构造哈希表;
  2. 根据选择的冲突处理方法解决地址冲突;
  3. 在哈希表的基础上执行哈希查找。
  • 对于无冲突的Hash表而言,查找复杂度为O(1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值