第七章 查找

7.1查找的基本概念

在哪查找?

查找表

 什么是查找?

主关键字:只能对应一个;次关键字:可以对应多个

查找是否成功? 

 查找的目的

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

查找表的分类

  • 静态查找表:不改变查找表的数据
  • 动态查找表:改变查找表的数据

如何评价查找算法

 7.2线性表的查找

7.2.1顺序查找

 算法的其他形式

 算法7.1的改进

改进:把待查关键字key存入表头(“监视哨”)从后往前逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度。

 时间效率分析:比较次数与key位置有关

  • 查找第i个元素,需要比较n-i+1次
  • 查找失败,需比较n+1次

 顺序查找的特点

优点:算法简单,逻辑次序无要求,且不同存储结构均适用

缺点:ASL太长,时间效率太低

7.2.2折半查找(二分或对分查找)——有序表

折半查找:每次将带查找记录所在区间缩小一半。

折半查找算法(非递归算法) 

思想

 具体算法 

 递归算法

前半区:Search_Bin(SSTable ST, keyType key, int low, int mid-1);

后半区:Search_Bin(SSTable ST, keyType key, int mid+1, int high);

 折半查找的性能分析——判定树

优点:效率比顺序查找高

缺点:只适用于有序表,且有限于顺序存储结构

7.2.3分块查找(索引顺序查找)

 性能分析

顺序法:ASL=(n+1)/2   

折半法 :ASL=log2(n+1)

分块查找的优缺点

 查找方法比较

7.3树表的查找

 7.3.1二叉排序树

 例题

左:48不符合“左子树上所有结点小于根结点”

右:bang不符合“右子树上所有结点大于等于根结点”(按字母先后顺序)

 二叉排序树的操作——查找

思路

 算法描述

时间跟树的形态(高度)有关

二叉排序树的操作——插入

思路

 二叉排序树的操作——生成

 二叉排序树的操作——删除

  • 删除叶子结点:直接删除该结点,其双亲结点中相应指针域的值为“空”
  • 删除的结点只有左子树或右子树:用其左子树或右子树替换它,其双亲结点的相应指针域的值改为“指向被删除结点的左子树或右子树”
  • 被删除的结点既有左子树又有右子树

 总结:

1、前驱进行替换:再根据该前驱结点属于删除的哪三种情况进行相应的删除

2、后继进行替换:再根据该后继结点属于删除的哪三种情况进行相应的删除

7.3.2平衡二叉树(AVL树)

定义

 平衡因子

 例题

 总结:

1、要保证平衡二叉树里面的每个结点都是一个平衡树

2、当发现两个结点都失衡,选择根结点的子树较少的那个结点(越靠下的)

失衡二叉排序树的分析与调整

平衡调整的四种类型:

 调整原则:1)降低高度 2)保持二叉排序树的性质 

1、LL型调整过程

 例题

 2、RR型调整过程

 3、LR型调整

 例题

 4、RL调整过程

例题

7.4散列(哈希)表的查找

7.4.1散列表的基本概念

 散列表相关术语

 7.4.2散列函数的构造方法

考虑的因素

  • 执行速度
  • 关键字的长度
  • 散列表的大小
  • 关键字的分布情况
  • 查找频率

直接定址法

 除留余数法

处理冲突的方法

  • 开放定址法
  • 链地址法
  • 再散列法
  • 建立一个公共溢出区

1、开放定址法(开地址法)

1.1. 例题:线性探测法

 总结:存入和查找原理类似

1.2二次探测法

1.3 伪随机探测法 

 2、链地址法(拉链法)

7.4.4散列表的查找

 例题

 使用平均查找长度ASL来衡量查找算法,ASL取决于

  • 散列函数
  • 处理冲突的方法
  • 散列表的装填因子a(a=表中填入的长度/哈希表的长度)

总结:

1、散列表技术具有很好的平均性能,优于一些传统的技术

2、链地址法优于开地址法

3、除留余数法作散列函数优于其他类型函数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Memorises1999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值