算法分析与设计第四、五章(查找与平衡二叉搜索树)

第四章:查找

第k值查找问题:

这一问题简单来说就是求解数组中阶为k的元素。

在一个由n个元素组成的集合里,阶为k的元素p意味着有k-1个元素比p小,n-k个元素比p大。

例如,最小值时第1个顺序统计量,最大值时第n个顺序统计量。

分治法

设原表长度为n,假定经过一趟分划,分成两个左右子表,其中左子表是主元及其左边元素的子表,设其长度为j,右子表是主元右边元素的子表。那么,

若k=j,则主元就是第k小元素

若k<p ,第k小元素必定在左子表中,需求解的子问题成为在左子表中求第k小元素

若k>p,则第k小元素必定在右子表中,需求解的子问题成为在右子表中求第k-p小元素

线性时间选择

如果能在线性时间内找到一个划分基准,使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1是某个正常数),那么就可以在最坏情况下用O(n)时间完成选择任务。

并查集

目的:表示动态的等价关系

需求:

需要经常合并集合 (等价类的合并)

需要经常查找元素属于哪个集合

第五章:平衡二叉搜索树

  树模型的基本术语:

(1)结点:每个数据元素称为结点

(2)结点的出度:该结点的分支数,即其子树的数目。

(3)叶子:出度为 0 的结点,即没有子树的结点。

(4)分枝结点:出度大于 0 的结点

区分树、二叉树、森林

二叉树是简单的树模型结构,每个结点至多有两棵子树(即二叉树中不存在出度大于2的结点),且二叉树的子树有左右之分,其次序不能随意颠倒。

二叉树是一种非常基本的树模型结构,广泛应用在决策、排序、查找等算法的设计,以二叉树为基础可以衍生出很多特殊而又重要的树模型,如:平衡树,红黑树等等。

二叉树的特征:

1.或者是一棵空树,或者是一棵由一个根结点和两棵互不相交的左子树和右子树所组成的非空树

2.每个结点最多只有两棵子树

3.子树有左右之分,其次序不能任意颠倒,只有一棵子树时也必须分清是左、右子树。

4.左子树和右子树同样也都是二叉树

3个结点的二叉树可能又五种不同形态

特殊二叉树

①斜树

只有左子树或者右子树

②满二叉树

所有的分支结点都有左孩子和右孩子,并且叶子节点集中在二叉树的最下一层。(叶子结点外的所有结点都有两个结点)

特征:

1.结点数达到最大

2.所有叶子节点均在最下一层

③完全二叉树

若二叉树的深度为h,除第h层外,其它层(1~h-1)的结点数都达到最大个数,第h层所有的结点都连续集中在最左边。

对于深度为K的,有N个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称为完全二叉树

树与二叉树->平衡树及其操作->红黑树及其操作

AVL平衡二叉树(AVL Trees 以它的发明者Adelson, Velski & Landis命名)

AVL树是最先发明的自平衡二叉查找树

对于二叉树的一些基本操作,比如插入、删除和查找等,其算法时间复杂度都与树的高度有关。因此,控制树高是最为关键的问题,而其中一个非常有效的措施就是尽量保持树的左右子树高度大致平衡,由此产生平衡二叉树的概念。

平衡二叉树是一种特殊的二叉树,要求树中任何结点的两棵子树的高度最大差别为1

如果插入或者删除一个结点使得高度之差大于1,需要重新进行平衡二叉树的操作

树模型中某结点左子树的高度减去该结点右子树的高度,所形成的差值称为该结点的平衡因子

平衡树 ( 平衡因子的绝对值 <=1)

插入节点的操作

以下四种情况下的插入操作可能会导致原有平衡二叉树发生不平衡:

(1)LL:若某一节点的平衡因子为 1,当在其左子树(Left)的左子树(Left)上插入一个新结点时会导致该结点的平衡因子由 1 变为 2。  

(2)LR:若某一节点的平衡因子为 1,当在其左子树(Left)的右子树(Right)上插 入一个新结点时会导致该结点的平衡因子由 1 变为 2。

(3)RR:若某一节点的平衡因子为-1,当在其右子树(Right)的右子树(Right)上 插入一个新结点时会导致该结点的平衡因子由-1 变为-2。

(4)RL:若某一节点的平衡因子为-1,当在其右子树(Right)的左子树(Left)上插 入一个新结点时会导致该结点的平衡因子由-1 变为-2。

插入节点的操作:

插入节点完成后,需要从插入的结点开始,维护一个到根结点的路径,每经过一个结点都要维持树的平衡,需要根据高度差的特点采取不同的旋转策略进行调整,使整棵树恢复成为平衡树。

删除操作

首先定位要删除的结点,删除完成后,要从删除结点的父亲开始向上维护树的平衡一直到根结点,然后采取不同的旋转策略调整,使整棵树恢复成为平衡树

若x结点为叶子结点,由于删去叶子结点不破坏整棵树的结构,则可直接删去该结点;

若x结点只有左子树而无右子树,根据二叉排序树的特点,可以直接将其左子树的根结点放在被删去的结点的位置;

若x结点只有右子树而无左子树,同样根据二叉排序树的特点,可以直接将其右子树的根结点放在被删去的结点的位置;

若x结点同时有左子树和右子树,则根据二叉排序树的特点,可以从其左子树中选择关键字最大的结点或者从其右子树中选择关键字最小的结点放在被删去结点的位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值