查找算法

0. 基本概念

  1. 关键字:数据记录中某个可以标识一条记录的数据项的值称为关键字。主关键字是可唯一标识一条记录的关键字,次关键字是用以识别若干条记录的关键字
  2. 查找:在一个查找表中找出关键字等于给定值 K 的记录。若查找成功,则返回记录的信息或记录在表中的位置;否则返回提示信息。
  3. 查找表:同一类型记录的集合
  4. 静态查找表:只对查找表进行“查找”操作的查找表
  5. 动态查找表:对查找表进行“增删改查”操作

1. 静态查找表

  1. 静态查找表一般为线性结构(数组、链表)
  2. 查找方式:顺序查找、二分查找(有序表)、插值查找(有序、均匀分布)、分块查找(将表分为若干个子表并添加索引)

2. 动态查找表

2.1 二叉排序树

  1. 又叫二叉查找树、二叉分类树
  2. 具体:https://blog.csdn.net/weixin_44811217/article/details/115640660

2.2 平衡二叉树(AVL树)

  1. 平衡因子(BF):BF= h-h
  2. 任意一个节点的BF的绝对值均小于2即为平衡二叉树
  3. 具体:https://blog.csdn.net/weixin_44811217/article/details/115640660

2.3 B 树

  1. B树的阶为所有结点中最高分支数
  2. 每个节点最多有m个分支(子树):而最少分支数要看是否为根节点,如果是根节点且不是叶子结点则至少有两个分支,非根叶子结点至少有[m/2](向上取整)个分支
  3. 有n( k<=n<=m )个分支的节点有 n-1 个关键字,他们按递增序列排序。 k=2(根节点)或【m/2】
  4. 节点内的数据互不相等
  5. 叶节点处于同一层:可以用空指针表示,是查找失败到达的位置
  6. B树的阶数是人为规定的,规定了一个节点最多有几个分支

2.4 B+树

  1. 有n个关键字的结点含有n个子树
  2. 所有的叶子结点中包含了全部关键字的信息及指向这些关键字记录的指针,且叶子结点本身按关键字的大小顺序链接
  3. 所有的分支节点可看成索引部分,结点中仅含有其子树(根节点)中最大(或最小的关键字)

2.5 红黑树

  1. 属性1:结点是红色或者黑色
  2. 属性2:根节点是黑色
  3. 属性3:所有叶子节点都是黑色
  4. 属性4:每个红色结点的两个叶子节点都是黑色
  5. 属性5:从每个叶节点到根节点的所有路径都包含相同数目的黑色结点
  6. 本质是4阶B树
  7. 将红色结点上移放在父结点(黑色结点)的旁边就变成了4阶B树

3. 散列(哈希)表查找

3.1 散列表

  1. 设所有可能出现的键集合记为U(简称全集)。实际发生(即实际存储)的键集合记为K,其中| K |比| U | 要小的多。
  2. 散列方法是使用函数h将U映射到T【0…m-1】 的下标上。这样以U中键为自变量,以h为函数的运算结果就是相应结点的存储地址。
  3. 成功平均查找长度(ASLs):查找表中关键词的平均查找比较次数
  4. 不成功平均查找长度(ASLu):不在散列表中的关键词的平均查找次数
  5. 在散列:当装填因子过大时,解决的方法是加倍扩大散列表,这个过程叫再散列

3.2 常用散列函数

  1. 直接定址法
  2. 除留取余法
  3. 数字分析法
  4. 折叠法
  5. 平方取中法
  6. 乘余取整法
  7. 随机数法(伪随机函数)

3.3 处理冲突的办法

3.3.1 开放定址法

  1. 线性探测法:以增量序列 1, 2, 3, 4…, 循环试探下一个存储地址
  2. 平均探测法(二次探测):以增量序列12 , -12 , 22 , -22 , 32,…, q2,-q2且q<tablesize/2循环试探下一个存储地址
  3. 双重散列法:hi=(H(key)+iH1(key)) mod m ;

3.3.2 拉链法(链地址法)

设散列函数得到的散列地址域再区间[0,m-1]上,以每个散列地址作为一个指针,指向一个链表,建立m个空链表,由散列函数对键转换后,映射到统一散列地址i的数据加入到同一个链表中。
在这里插入图片描述

3.3.3 建立一个公共溢出区

  1. 建立两个表基本表和溢出表
  2. 基本表只能存放一个元素
  3. 产生冲突时将其存入溢出表
  4. 查找元素时先去基本表找不到再去溢出表

3.4 散列表的查找分析

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值