数据结构与算法(五)检索(查找)基本算法

概念

  • 检索表:待查找的数据容器,例如线性表、树表(树、二叉树、B/B+树)等
  • 关键字:key
  • 关键字值:key对应的value
  • 检索/查找:Search

1. 线性表的检索

1.1 顺序检索

可用于所有线性表,包括顺序表和链表。

1.2 二分法检索

只能用于顺序表(数组)。

1.2.1 黄金分割点检索

与二分法检索类似,但是分割检索区间的方式不同;二分法以二等分的方式分割检索区间,黄金分割点以0.618比例方式分割检索区间

1.3 精算点检索

如果检索表是有序而且分布均匀的,可通过计算估算检索位置。只能用于顺序表。

1.3 分块检索

是顺序检索的一种改进方法。效率介于顺序检索和二分查找之间。分块检索不要求检索表中所有记录关键字有序排列,但要求把检索表分成若干块,并且各块之间按key大小有序。即块间有序、块内无序。

1.4 跳跃表

又叫跳表,一种基于有序链表的扩展,具有二分查找的查找效率,又具有链表的插入/删除效率。

2. 树表的检索

2.1 二叉检索树/二叉查找树(BST:Binary Search Tree)

  • 是一个二叉树
  • 左子树不空,则左子树上所有结点的值小于根结点的值
  • 右子树不空,则右子树上所有结点的值大于根结点的值
  • 查找时比较次数不超过树的深度

2.1.1 平衡二叉树/AVL树

平衡因子的绝对值不超过1的二叉树(网上查到都是说平衡二叉树是二叉检索树)。

平衡因子:该结点的左子树深度减去右子树深度的差

  • 插入或删除结点可能导致不平衡,需要调整

2.2 B树/B+树

B树是一种平衡的多路检索树(平衡N叉检索树)

B树的特点:

  • 一个结点最多有N-1个键(key)
  • 一个结点最多有N棵子树
  • 除根结点外,所有非终端结点至少有[N+1/2]棵子树

B+树的特点:

  • 是一种B树的变形树
  • 有n棵子树的结点含有n个键(key)
  • 节点的每个键是对应子树的最大(或最小)键
  • 所有叶子结点包含了全部键的信息

3. 哈希检索

前两种检索方式,键在检索表中的位置都是随机的,或者说是相对的,与其键(key)不存在某种确定的关系。
哈希检索是一种直接利用键来确定记录在检索表中位置的技术。

  • 哈希函数
  • 哈希地址冲突(collision)

3.1 地址冲突的消解策略

在数据插入时,可能发生插入的位置已经存在数据,即有地址冲突。如何解决这个问题?

3.1.1 开发定址法

从插入的位置开始,查找一个最近的空地址用于存储记录。

  1. 线性探查法
    将哈希表看作是环形表,从当前地址往后查:(d+1)%m、(d+2)%m…,m为哈希表的长度
  2. 平方查找法
    以(d+i)%m的方式查,i取值:12 , -12 , 22 , -22
  3. 随机探查法
    选取随机数作为地址位移来计算下一个地址

3.1.2 拉链法

将哈希地址相同的键的记录链接到同一个单链表中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值