美文网首页
数据结构与算法-数组查找

数据结构与算法-数组查找

作者: 收纳箱 | 来源:发表于2020-05-15 09:42 被阅读0次

1. 顺序查找

1.1 普通顺序查找

int SequentialSearch(int *a, int n, int key) {
    for (int i = 0; i < n; i++) {
        if (a[i] == key) {
            return i;
        }
    }
    return NOT_FOUND;
}

1.2 哨兵顺序查找

我们看到,顺序查找的时候每次都要先判断i<n,能不能去掉这个判断呢?

我们可以使用一个哨兵,即数组第0位是空出来的情况,将其作为哨兵,存入查询值。

  • 引入哨兵后,肯定可以在数组中找到查询值,若在中途找到,即数组中确实有这个值;若最后才找到,说明找到的是我们的哨兵,数组中没有这个值。

注意: 使用哨兵,①第0位存储时空出来;②返回0表示没有找到。

int SequentialSearch2(int *a, int n, int key) {
    int i = n;
    a[0] = key;
    while (a[i--] != key);
    return i;
}

2. 折半查找与变体

折半查找和相关变体,需要数组是有序的!下面的算法针对升序数组进行说明。

下面几种算法都是折半和折半公式的变式,核心都是缩小范围,利用夹逼定理进行搜索。

2.1 折半查找

通过范围折半,不断缩小搜索范围,节省时间。

int BinarySearch(int *a, int n, int key) {
    int l,c,r;
    l = 0;
    r = n-1;
    while (l <= r) {
        c = (l + r) >> 1;// 折半
        if (key < a[c]) {
            r = c - 1;
        } else if (key > a[c]) {
            l = c + 1;
        } else {
            return c;
        }
    }
    return NOT_FOUND;
}

2.2 插入查找

需要每个数据的分布是一致的。通过计算查询值在整体范围的偏移量进行查询。

int InterpolationSearch(int *a, int n, int key){
    int l,c,r;
    l = 1;
    r = n-1;
    while (l <= r) {
        //插值
        c = l + (r-l)*(key-a[l])/(a[r]-a[l]);
        if (key < a[c]) {
            r = c - 1;
        } else if (key > a[c]) {
            l = c + 1;
        } else {
            return c;
        }
    }
    return NOT_FOUND;
}

2.3 斐波那契查找

通过斐波那契数列递增的特性,反过来利用,即递减特性,缩小范围。

  • 注意点是数量不够的部分需要进行补齐。
int F[100]; /* 斐波那契数列 */
int Fibonacci_Search(int *a, int n, int key){
    int l, c, r;
    l = 0;
    r = n-1;
    
    int k = 0;
    //1.计算n为斐波拉契数列的位置
    while (n > F[k]) {
        k++;
    }
    //2.将数组a不满的位置补全值;
    for (int i = n; i < F[k]; i++) {
        a[i] = a[n-1];
    }
    
    while (l <= r) {
        c = l + F[k-1] - 1; //计算当前分隔的下标
        if (key < a[c]) {
            r = c-1;
            k = k-1; //斐波拉契数列下标减1位
        } else if (key > a[c]) {
            l = c+1;
            k = k-2; //斐波拉契数列下标减2位
        } else {
            return c < n ? c : n-1;
        }
    }
    return NOT_FOUND;
}

相关文章

  • 数据结构与算法--散列表

    数据结构与算法--散列表 之前学习了基于链表的顺序查找、基于有序数组的二分查找、二叉查找树、红黑树,这些算法在查找...

  • 重温:数据结构与算法 - 03数组

    数据结构与算法之美 - 数组 数据结构与算法之美-学习大纲 什么数组? 数组是一种 线性表 数据结构。它用一组 连...

  • 算法草稿

    常用算法集合 字符处理算法数组与查找链表树算法思路 递归、动态规划、BFS/DFS、双指针、二分法搜索数据结构的...

  • Hash算法

    数据结构与算法分析:大纲数据结构:数组算法:hash算法算法:排序算法Java实现 1 Hash算法? 将任意长度...

  • 数据结构与算法--二叉查找树

    数据结构与算法--二叉查找树 上节中学习了基于链表的顺序查找和有序数组的二分查找,其中前者在插入删除时更有优势,而...

  • 数据结构与算法-数组查找

    1. 顺序查找 1.1 普通顺序查找 1.2 哨兵顺序查找 我们看到,顺序查找的时候每次都要先判断,能不能去掉这个...

  • 数据结构:数组

    00数据结构与算法分析:大纲01数据结构:数组02数据结构:链表03数据结构:栈03数据结构:队列 数组 数组是一...

  • 20181205_ARTS_W9

    Algorithm 数据结构与算法之美之变形二分查找大前提:都是有序数组,可能存在重复元素 查找第一个等于某个数值...

  • 排序算法

    算法与数据结构基础 查找算法: 二分查找法: 简介:二分查找法又被称为折半查找法,用于预排序的查找问题 过程: 如...

  • 想去阿里——这是你必备的实力

    算法和数据结构数组、链表、二叉树、队列、栈的各种操作(性能,场景) 二分查找和各种变种的二分查找 各类排序算法以及...

网友评论

      本文标题:数据结构与算法-数组查找

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