博客
关于我
【数据结构】查找 上
阅读量:720 次
发布时间:2019-03-21

本文共 2518 字,大约阅读时间需要 8 分钟。

查找与索引技术

查找概론

查找表是由同一类型数据元素或记录构成的集合。键是数据元素中某个数据项的值,而主键则可以唯一标识一个记录。查找是根据给定值在查找表中确定一个关键字等于该值的数据元素或记录。

查找表可以分为静态和动态两种类型。静态查找表仅进行查找操作,而动态查找表在查找过程中可能插入或删除数据元素。

顺序表查找

顺序表查找,又称线性查找,是最基本的查找技术。其工作原理是从表中第一个或最后一个记录开始,逐个比较关键字和给定值,直到找到相等的记录(查找成功)或遍历完整个表(查找失败)。

有哨兵查找

以下是有哨兵顺序查找的实现代码:

int Sequential_Search2(int *a, int n, int key) {    int i;     a[0] = key; // 设置a[0]为关键字值,称为“哨兵”    i = n;       // 循环从尾部开始    while (a[i] != key) {        i--;    }    return i; // 返回0则说明失败}

有序表查找

有序表查找需要前提条件:线性表中的记录必须按关键码有序(通常从小到大)。其核心思想是,在有序表中,先取中间记录作为比较对象,若给定值与中间记录的关键字相等则查找成功;若给定值小于中间记录的关键字,则在左半区继续查找;若大于,则在右半区继续查找。

折半查找

以下是折半查找的实现代码:

int Binary_Search(int *a, int n, int key) {    int low, high, mid;    low = 1;     high = n;    while (low <= high) {        mid = low + (high - low) / 2; // 折半        if (key < a[mid]) {            high = mid - 1; // 调整最高下标到中位下标小一位        } else if (key > a[mid]) {            low = mid + 1; // 调整最低下标到中位下标大一位        } else {            return mid; // 若相等则返回mid位置        }    }    return 0; // 返回0表示失败}

插值查找

插值查找是根据二次插值计算公式进行的 keys - a[low] / (a[high] - a[low])。其优点是可以显著减少查找次数,但前提是表必须严格有序。

以下是插值查找的实现代码:

int Interpolation_Search(int *a, int n, int key) {    int low, high, mid;    low = 1;    high = n;    while (low <= high) {        mid = low + (high - low) * (key - a[low]) / (a[high] - a[low]); // 插值计算        if (key < a[mid]) {            high = mid - 1; // 调整最高下标到插值下标小一位        } else if (key > a[mid]) {            low = mid + 1; // 调整最低下标到插值下标大一位        } else {            return mid; // 相等则返回mid位置        }    }    return 0; // 返回0表示失败}

斐波那契查找

斐波那契查找算法通过维护一个斐波那契序列来确定查找范围。其核心思想是根据当前搜索范围和查找值与中间关键字的关系动态调整查找范围。

以下是斐波那契查找的实现代码:

int Fibonacci_Search(int *a, int n, int key) {    int low, high, mid, i, k = 0;    low = 1;    high = n;    while (n > F[k] - 1) {        k++;    }    for (i = n; i <= F[k] - 1; i++) {        a[i] = a[n];    }    while (low <= high) {        mid = low + F[k - 1] - 1;        if (key < a[mid]) {            high = mid - 1;            k--;        } else if (key > a[mid]) {            low = mid + 1;            k = k - 2;        } else {            if (mid <= n) {                return mid;            } else {                return n;            }        }    }    return 0;}

线性索引

线性索引是将索引项集合组织为线性结构。索引表的内存布局通常采用稠密索引,即每个关键码对应唯一的索引项。

稠密索引

稠密索引要求在每个记录中都包含其对应的索引项。这样的索引表必须是按关键码有序排列的。

分块索引

分块索引将数据集的记录分成若干块,满足以下两个条件:

  • 列表内无序
  • 列表间有序
  • 分块索引的索引项结构包括以下三个数据项:

  • 最大关键码
  • 记录个数
  • 块首指针
  • 在查询时,首先在分块索引表中定位块,再根据块首指针进入块内部进行顺序查找。

    倒排索引

    倒排索引方法记录号表存储具有相同次关键字的所有记录的 主关键字(或记录号)。这样的索引方法可以快速定位所有具有特定次关键字的记录。

    转载地址:http://yarrz.baihongyu.com/

    你可能感兴趣的文章
    OpenCV使用霍夫变换检测图像中的形状
    查看>>
    opencv保存图片路径包含中文乱码解决方案
    查看>>
    OpenCV保证输入图像为三通道
    查看>>
    OpenCV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    opencv图像分割2-GMM
    查看>>
    opencv图像分割3-分水岭方法
    查看>>
    opencv图像切割1-KMeans方法
    查看>>
    OpenCV图像处理篇之阈值操作函数
    查看>>
    opencv图像特征融合-seamlessClone
    查看>>
    OpenCV图像的深浅拷贝
    查看>>
    OpenCV学习(13) 细化算法(1)(转)
    查看>>
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
    查看>>
    OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
    查看>>
    OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
    查看>>
    OpenCV官方文档 理解k - means聚类
    查看>>
    OpenCV探索
    查看>>
    OpenCV环境搭建(一)
    查看>>
    openCV目标识别 目标跟踪 YOLO5深度学习 Python 计算机视觉 计算机毕业设计 源码下载
    查看>>
    opencv笔记(1):图像缩放
    查看>>