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

数据结构与算法-查找

作者: SK_Wang | 来源:发表于2020-05-15 15:12 被阅读0次

查找表是由同一类型的数据元素构成的集合。由于集合中的数据元素之间存在着完全松散的换洗,因此查找表是一种非常领边的数据结构。

对查找表经常进行的操作:

  • 查询某个特定的数据元素是否在查找表中;
  • 检索某个特定的数据元素的各种属性;
  • 在查找表中插入一个数据元素;
  • 在查找表中删去某个数据元素;

静态查找表(Static search table)

顺序表的查找

顺序查找(Sequential Search)的查找过程:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若知道第一个记录,其关键字和给定值比较不相等,则表明表中没有所查记录,查找不成功。

// 顺序查找
int Sequential_Search(int *a, int n, int key) {
    for (int i = 1; I <= n; i++) {
        if (a[i] == key) {
            return i;
        }
    }
    return 0;
}

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

有序表的查找

折半查找(Binary Search)的查找过程:先确定待查找记录所在的范围,然后珠逐步缩小范围直到找到或找不到该记录为止。

// 折半查找算法
int Binary_Search(int *a, int n, int key) {
    int mid;
    int low = 0;
    int high = n;
    while (low <= high) {
        mid = (high + low) >> 1;
        if (key < a[mid]) {
            high = mid - 1;
        } else if (key > a[mid]) {
            low = mid + 1;
        } else {
            return mid;
        }
    }
    return 0;
}
// 插值查找
int Interpolation_Search(int *a, int n, int key) {
    int mid;
    int low = 0;
    int 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;
        }
    }
    return 0;
}
//5.斐波拉契查找
int F[100]; /* 斐波那契数列 */
int Fibonacci_Search(int *a, int n, int key) {
    int low, high, mid, i, k;
    low = 1;
    high = n;
    k = 0;
    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 = k - 1;
        } else if(key > a[mid]){
            low = mid + 1;
            k = k - 2;
        } else {
            if (mid <= n) {
                return mid;
            } else {
                return n;
            }
        }
    }
    return 0;
}

动态查找表 (Dynamic search table)

二叉排序树(Binary sort Tree)或者是一颗空树;或者是具有下列性质的二叉树;

  1. 若它的左子树不空,则左子树上所有结点的值均小于它的跟结点的值;
  2. 若它的右子树不空,则右子树上所有结点的值均大于它的跟结点的值;
  3. 它的左、右子树也分别为二叉树排序树;

代码实现

typedef int Status;

typedef  struct BiTNode {
    int data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

// 二叉排序树--查找
Status SearchBST(BiTree T, int key, BiTree f, BiTree *p) {
    if (!T) {
        *p = f;
        return FALSE;
    }
    
    if (T->data == key) {
        *p = T;
        return TRUE;
    } else if (key < T->data) {
        return SearchBST(T->lchild, key, T, p);
    } else {
        return SearchBST(T->rchild, key, T, p);
    }
}

Status InsertBST(BiTree *T, int key) {
    BiTree p, s;
    if (!SearchBST(*T, key, NULL, &p)) {
        s = (BiTree)malloc(sizeof(BiTNode));
        s->data = key;
        s->lchild = s->rchild = NULL;
        
        if (!p) {
            *T = s;
        } else if (key < p->data) {
            p->lchild = s;
        } else {
            p->rchild = s;
        }
        return TRUE;
        
    }
    return FALSE;
}

// 从二叉排序树中删除结点p,并重接它的左或者右子树;
Status Delete(BiTree *p){
    BiTree temp, s;
    if((*p)->rchild == NULL) {
        temp = *p;
        *p = (*p)->lchild;
        free(temp);
    } else if((*p)->lchild == NULL) {
        temp = *p;
        *p = (*p)->rchild;
        free(temp);
    } else {
        temp = *p;
        s = (*p)->lchild;
        while (s->rchild) {
            temp = s;
            s = s->rchild;
        }
        (*p)->data = s->data;
        
        if(temp != *p)
            temp->rchild = s->lchild;
        else
            temp->lchild = s->lchild;
        free(s);
    }
    
    return  TRUE;
}

// 查找结点,并将其在二叉排序中删除;
Status DeleteBST(BiTree *T, int key) {
    if(!*T) {
        return FALSE;
    } else {
        if (key == (*T)->data)
            return Delete(T);
        else if (key < (*T)->data)
            return DeleteBST(&(*T)->lchild, key);
        else
            return DeleteBST(&(*T)->rchild, key);
    }
}

相关文章

  • 排序算法

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

  • 数据结构与算法--Boyer-Moore和Rabin-Karp子

    数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找 Boyer-Moore字符串查找算法 ...

  • 剑指Offer--(3)查找空格

    title: 剑指Offer--(3)查找空格categories: 算法与数据结构tags: 数据结构 题目 请...

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

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

  • 音视频开发之旅(27) 算法序列 - 二叉查找树

    目录 常见的查找数据结构和算法介绍 二叉查找树 资料 收获 一、常见的查找数据结构和算法介绍 1.1 链表(顺序查...

  • 数据结构与算法 树 引言 顺序查找 ​ 哨兵的方式 ​ 时间复杂度为O(N) 二分查找查找树的形式我...

  • 常考的数据结构与算法之算法

    本文记录一下我学习数据结构与算法中算法的知识点,使用的语言是C/C++语言 查找 二分查找又叫折半查找,要求线性表...

  • 数据结构与算法 - 查找

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构数据结构...

  • 数据结构与算法——查找算法

    一、定义 查找:根据给定的某一个值,在查找表中确定一个其关键字等于给定值的数据元素。查找表:是有同一类型的数据元素...

  • 数据结构与算法——单词查找树

    数据结构与算法——单词查找树 单词查找树由字符键中的所有字符构造而成,和各种查找树一样,单词查找树也是由结点链接所...

网友评论

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

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