数据结构——查找技术

数据结构 专栏收录该内容
12 篇文章 0 订阅

查找的基本概念

列表:由同一类型的数据元素组成的集合。
关键码:数据元素中的某个数据项,可以标识列表中的一个或一组数据元素。
键值:关键码的值。
主关键码:可以唯一地标识一个记录的关键码。
次关键码:不能唯一地标识一个记录的关键码。


查找 :在具有相同类型的记录构成的集合中找出满足给定条件的记录。
查找的结果 :若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。
静态查找 :不涉及插入和删除操作的查找 。
**动态查找 **:涉及插入和删除操作的查找。
静态查找适用于:查找集合一经生成,便只对其进行查找,而不进行插入和删除操作; 或经过一段时间的查找之后,集中地进行插入和删除等修改操作;
动态查找适用于:查找与插入和删除操作在同一个阶段进行,例如当查找成功时,要删除查找到的记录,当查找不成功时,要插入被查找的记录。


查找结构 :面向查找操作的数据结构 ,即查找基于的数据结构。
本章讨论的查找结构 :

  • 线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。
  • 树表:适用于动态查找,主要采用二叉排序树的查找技术。
  • 散列表:静态查找和动态查找均适用,主要采用散列技术。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

线性表的查找技术

#include 
using namespace std;

const int MaxSize = 100;
class LineSearch{
public:
    LineSearch(int a[ ], int n); //构造函数
    ~LineSearch( ) { } //析构函数为空
    int SeqSearch(int k); //顺序查找
    int BinSearch1(int k); //折半非递归查找
    int BinSearch2(int low, int high, int k); //折半递归查找
private:
    int data[MaxSize]; //查找集合为整型
    int length; //查找集合的元素个数
};

LineSearch :: LineSearch(int a[ ], int n){
    for (int i = 0; i < n; i++)
        data[i+1] = a[i]; //查找集合从下标1开始存放
    length = n;
}

顺序查找

普通的顺序查找方法

在这里插入图片描述


int LineSearch :: SeqSearch(int k)
{   
     i=n;
     while (i>0 && data[i]!=k)
         i--;
     return i;
}

带监视哨的顺序查找方法

在这里插入图片描述


int LineSearch :: SeqSearch(int k)
{ 
    int i = length;        //从数组高端开始比较
    data[0] = k;           //设置哨兵
    while (data[i] != k) //不用判断下标i是否越界
        i--;
    return i; 
}

在这里插入图片描述

折半查找

折半查找的基本思想

在这里插入图片描述
在这里插入图片描述

int LineSearch :: BinSearch1(int k){
     int mid, low = 1, high = length; //初始查找区间是[1, n]
     while (low <= high) {//当区间存在时
          mid = (low + high) / 2; 
          if (k < data[mid]) 
              high = mid - 1;
          else if (k > data[mid]) 
               low = mid + 1; 
          else
               return mid; //查找成功,返回元素序号
      }
      return 0; //查找失败,返回0
}


int LineSearch :: BinSearch2(int low, int high, int k){
      if (low > high) 
          return 0; //递归的边界条件
      else {
         int mid = (low + high) / 2;
      if (k < data[mid]) 
           return BinSearch2(low, mid-1, k);
      else if (k > data[mid]) 
           return BinSearch2(mid+1, high, k); 
      else 
           return mid; //查找成功,返回序号
     }
}

折半查找的判定树

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

树表的查找技术

线性表查找是静态的查找,要在线性表上进行动态查找,存在以下的问题

  • 无序顺序表上进行动态查找,插入操作简单,但查找的复杂性高
  • 有序顺序表上进行动态查找,查找的时间复杂性好,但是插入操作时间复杂性高
  • 单链表上进行动态查找,插入操作简单,但查找操作复杂性高
    解决办法:
    采用二叉树这种数据结构,实现动态查找

二叉排序树(BST)

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
template <class DataType> 
struct BiNode{    DataType data;     BiNode *lchild, *rchild;  };
class BiSortTree {
public:
    BiSortTree(int a[ ], int n); //建立查找集合a[n]的二叉排序树
     ~ BiSortTree( ){ Release(root); } //析构函数,同二叉链表的析构函数
    void InOrder( ){InOrder(root);} //中序遍历二叉树
    BiNode *InsertBST(int x) {return InsertBST(root, x);} //插入记录x
    BiNode *SearchBST(int k) {return SearchBST(root, k);} //查找值为k的结点
    void DeleteBST(BiNode *p, BiNode *f ); //删除f的左孩子p
private:
   void Release(BiNode *bt);
   BiNode *InsertBST(BiNode *bt , int x);  
   BiNode *SearchBST(BiNode *bt, int k); 
   void InOrder(BiNode *bt); //中序遍历函数调用
   BiNode *root; //二叉排序树的根指针
};

平衡二叉树(AVL)

平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:
⑴ 根结点的左子树和右子树的深度最多相差1;
⑵ 根结点的左子树和右子树也都是平衡二叉树。
平衡因子:结点的平衡因子是该结点的左子树的深度与右子树的深度之差。
在平衡树中,结点的平衡因子可以是1,0,-1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

散列表(hash)的查找技术

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值