王道数据结构 查找的概念:

查找的概念:

查找:在数据集合中查找满足某种条件的数据元素的过程称为查找

查找表(查找结构):用于查找的数据集合成为查找表,它由同一类型的数据元素或记录组成

关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应是唯一的

考虑实际使用中的操作效率:

平均查找长度 ASL:

总结:

顺序查找的实现:

用查找判定树分析 ASL:

成功结点查找长度:自身所在层数

一个异常的结点查找长度:其父结点所在层数(共有 n+1种查找异常的情况)

默认情况下,各异常情况或成功情况都等概率发生

顺序查找的优化(被查找概率不相等):

将被查概率大的结点放在靠前位置,这样顺序就不保证了,根据实际应用来使用

总结:

折半查找算法思想(二分查找法,适用有序和顺序表):

二分查找法实现逻辑;更好 min的 left和 right的下标值:

二分查找法的效率:

二分查找判定树的构造:二分查找判断树一定是平衡二叉树

右子树结点树 - 左子树结点树 = 0,1(即总结点为 偶数时则最左子树少一个结点)

折半查找的查找效率:

总结:

分块查找:

分块查找的算法思想:

索引表中保存的是目标快中最大的索引值,所以目标关键字在索引表中不存在时则以 low>high 的 low所在块区间进行查找,若 low超出查找范围则查找异常

查找效率分析:(ASL)

最优 ASL的结果为:

总结:

二叉排序树的定义(BST):

左子树结点值 < 根结点值 < 右子树结点值:左右子树又是一颗二叉排序树:中序遍历时增序

代码实现部分:

递归代码实现:

二叉排序树的插入:(递归实现 空间复杂度 O(h))用循环方式来删除效果更好

二叉排序树的删除:

二叉排序树用删除结点的直接后继来替代:单前结点的右子树最小的结点(一定没有左子树)来替换删除结点

这样就转换为第一种或第二种情况,把替换删除结点位置结点空出的位置左子树接替上去

二叉排序树用删除节点的直接前驱来替代:

查找效率分析:使树的高度最小

树的长度最小:平衡二叉树

查找视频的平均查找长度 ASL值:

总结:

平衡二叉树的定义(AVL):

平衡二叉树:树上任一结点的左子树和右子树的高度只差不超过 1(结点的平衡因子 = 左子树的高度-右子树高度)

平衡二叉树的插入

每次调整的对象是:最小不平衡子树  

如何调整最小不平衡子树:

调整最小不平衡子树(LL):右旋

右旋操作:由于结点 A的左孩子(L)上插入了新结点,A的平衡因子由 1增至 2,导致以 A为根的子树失去平衡,需要一次向右旋转的操作。将 A的左孩子 B向右上旋转替代 A成为根节点,将 A结点向右下旋转为 B的右子树的根结点,而 B的原右子树则作为 A结点的左子树

调整最小不平衡子树(RR):左旋

左旋操作:由于结点 A的右孩子 (R)的右子树 (R)上插入了新结点,A的平衡因子由 -1减至 -2,导致 以 A为根的子树失去平衡,需要一次向左旋转的操作,将 A的右孩纸 B向左上旋转代替 A成为根结点,将 A结点向左下旋转成为 B的左子树的根结点,而 B的原左子树则作为 A结点的右子树

左旋和右旋代码思路:保持二叉排序树的特点

调整最小不平衡子树:

只有左孩子才能右上旋,只有右孩子才能左上旋转

练习:把最小不平衡子树的高度恢复,那么其他根结点都会恢复平衡

通过 RR的方式来做:

RL:型表示为 整个不平衡树中,右子树的左子树的插入导致的不平衡

总结:

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值