目录

  1. 1. 前言
  2. 2. 基本概念
  3. 3. 线性表的查找
    1. 3.1. 顺序查找(线性查找)
    2. 3.2. 折半查找(二分查找)
    3. 3.3. 分块查找
  4. 4. 树表的查找
    1. 4.1. 二叉排序树
      1. 4.1.1. 查找
      2. 4.1.2. 插入&生成
      3. 4.1.3. 删除
      4. 4.1.4. 性能分析

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

查找

2024/1/22 Basic 数据结构
  |     |   总文章阅读量:

前言

烂尾+1

基本概念

  • 查找表:由同一类型的数据元素(或记录)构成的集合
  • 静态查找表:查找的同时对查找表不做修改操作(如插入和删除)
  • 动态查找表:查找的同时对查找表具有修改操作
  • 关键字:记录中某个数据项的值,可用来识别一个记录
  • 主关键字:唯一标识数据元素
  • 次关键字:可以标识若干个数据元素

常用操作:

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

关键字的平均比较次数,也称平均搜索长度ASL(Average Search Length)

image-20240122230433127

n:记录的个数

pi:查找第i个记录的概率 ( 通常认为pi =1/n )

ci:找到第i个记录所需的比较次数


线性表的查找

顺序查找(线性查找)

应用:顺序表或线性链表表示的静态查找表,表内元素之间无序


折半查找(二分查找)

仅适用于有序的顺序表

非递归算法:

  1. 设表长为n,low、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定值

  2. 初始时,令low=1,high=n,mid= (low+high)/2

  3. 让k与mid指向的记录比较

    若k==R[mid].key,查找成功

    若k<R[mid].key,则high=mid-1

    若k>R[mid].key,则low=mid+1

  4. 重复上述操作,直至low>high时,查找失败


分块查找

块间有序,块内无序

即分成若干子表,要求每个子表中的数值都比后一块中数值小

image-20240122232102655


树表的查找

表结构在查找过程中动态生成

对于给定值key,若表中存在,则成功返回;否则插入关键字等于key的记录

二叉排序树

空树 或 满足如下性质的二叉树:

  • 若其左子树非空,则左子树上所有结点的值均小于根结点的值

  • 若其右子树非空,则右子树上所有结点的值均大于等于根结点的值

  • 其左右子树本身又各是一棵二叉排序树

查找

算法思想:

  1. 若二叉排序树为空,则查找失败,返回空指针

  2. 若二叉排序树非空,将给定值key与根结点的关键字T->data.key进行比较:

    若key等于T->data.key,则查找成功,返回根结点地址;

    若key小于T->data.key,则进一步查找左子树;

    若key大于T->data.key,则进一步查找右子树

插入&生成

若二叉排序树为空,则插入结点应为根结点;否则,继续在其左、右子树上查找

插入的元素一定在叶结点上

从左往右遍历序列

image-20240122233000492

删除

性能分析

平衡因子:该结点左子树与右子树的高度差

左、右子树是平衡二叉树;所有结点的左、右子树深度之差的绝对值≤1