查找

作者: ahuustcly | 来源:发表于2018-10-10 23:38 被阅读0次

1. 概述

查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的
数据元素。

查找表按照操作方式分为:静态查找表和动态查找表。

  • 静态查找表:只作查找操作的查找表
  • 动态查找表:在查找的过程中,会同时的插入查找表中不存在的数据元素,或者删除已经存在的某个元素

2. 顺序查找

最基本的查找技术,适合于存储结构为顺序存储或者链式存储的线性表,时间复杂度为O(n)

int sequence_search(int a[],int n, int key)
{
    for (int i = 0; i < n; i++)
    {
        if (key == a[i]){
            return i;
        }
    }
    return -1;
}

3. 有序查找

  • 二分查找
    又称为折半查找,前提条件是线性表中的记录必须是有顺序的,即采用顺序存储,时间复杂度为O(logn)。基本思想为:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;反之,则在中间记录的右半区继续查找,不断重复上述步骤直至查找成功。
int binary_search(int a[], int n, int key)
{
    int low = 0;
    int high = n - 1;
    int mid;
    while (low < high)
    {
        mid = (low + high) / 2;
        if (key == a[mid])
        {
            return mid;
        }
        else if (key < a[mid])
        {
            high = mid - 1;
        }
        else
        {
            low = mid + 1;
        }
    }
    return -1;
}

  • 插值查找
    原先的,mid = low + ½(high - low),
    改进为,mid = low + (key - a[low]) / (a[high] - a[low]) (high - low)
    基本思想为:插值查找是根据要查找的关键字key与查找表中的最大最小记录的关键字比较后的查找方法。从时间复杂度来看为O(logn),但是其平均性能要比折半查找好很多。

  • 斐波那契查找
    利用斐波那契数列的黄金分割原理来实现。
    改进为,mid = low + F[k-1] - 1,其中k为斐波那契数列的下标,F[k-1]为斐波那契数列。

4. 线性索引查找

索引就是把一个关键字与它对应的记录相关联的过程。这里主要关注三种线性索引:稠密索引、分块索引、倒排索引。

  • 稠密索引
    在线性索引中,将数据集中的每个记录对应一个索引项,且索引项是按照关键码有序的排列。因此可以使用折半、插值、斐波那契等有序查找法,提高效率,但是空间代价比较高。

  • 分块索引
    将数据集的记录分成了若干块,并且这些块需要满足两个条件:

    • 块内无序
    • 快间有序

    因此,查找分为两个步骤进行:①在分块索引表中查找关键字所在的块;②在相应的块中顺序查找关键码。分块索引普遍被用于数据库查找等技术的应用当中。

  • 倒排索引

5. 树查找

  • 二叉排序树
  • AVL树
  • 红黑树
  • B/B+树

关于树查找请参考:

6. 哈希查找

  • 定义
    在记录的存储位置和其关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。其中,f为哈希函数,记录存储的连续的存储空间称为哈希表。
  • 查找步骤
    • 存储时,通过哈希函数计算哈希地址,并存储
    • 查找时,通过哈希函数计算哈希地址,并访问
  • 哈希函数
    好的哈希函数的原则:计算简单、哈希地址分布均匀
    • 直接定址法
    • 数字分析法
    • 平方取中法
    • 折叠法
    • 除留余数法
    • 随机数法
  • 处理哈希冲突的方法
    两个关键字key1 ≠ key2,但是却出现f(key1) = f(key2),称这种现象为冲突。解决冲突的方法有:
    • 开放定址法
      一旦发生了冲突,就去寻找下一个空的散列地址
    • 再散列函数法
    • 链地址法
    • 公共溢出区法
  • 实现

7. 参考

大话数据结构 ---- 程杰

相关文章

  • 《数据结构与算法》知识点(四)

    第七章 查找 顺序查找、折半查找、索引查找、分块查找是静态查找,动态查找有二叉排序树查找,最优二叉树查找,键树查找...

  • 查找

    静态查找顺序查找 折半查找 散列查找 动态查找二叉排序树 散列查找 ASL(平均查找长度) - 衡量查找算法效率的...

  • PHP查找算法

    静态查找 顺序查找 折半查找 递归折半查找

  • 6.1 查找算法_基础

    1. 查找基本概念 查找:只有两种情况,查找成功,查找失败 查找表:查找的数据集合称为查找表 静态查找表 / 动态...

  • 据结构与算法学习-查找与二叉排序树

    查找表操作方式分为静态查找和动态查找。静态查找表(Static Search Table): 只作查找操作的查找表...

  • iOS-字符串查找

    字符串查找通常有四种方式,暴力查找,KMP查找,BoyerMoore查找以及RabinKarp算法查找,查找最简单...

  • linux 查找目录或文件

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) ...

  • Linux查找文件、文件夹

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) ...

  • linux常用命令

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) ...

  • linux查找文件夹、文件

    查找目录:find /(查找范围) -name '查找关键字' -type d 查找文件:find /(查找范围)...

网友评论

    本文标题:查找

    本文链接:https://www.haomeiwen.com/subject/qoajoftx.html