数据结构-最小生成树,B-树

数据结构–提醒自己的知识点总结

我真的是吐了我是鱼吧我的记忆力,气死我了气死我了气死我了。
但虽然气死我了,还是要稍微总结大块的知识点与问题

1.Prim和Kruskal算法求最小生成树

这两个算法是不难理解的,但是就是说。谁的算法是拿来干嘛的要搞清楚啊
那首先该如何区别呢,直接刚题目,我发现如果是用P算法就会指定一个点,让你求最小生成树,如果用K算法,就啥也不会给。
但是,真的会有题目变态的不行,它直接让你把两种方法都干上去,然后给你一个点。绝了,这个时候你分不清楚该怎么办呢。
所以,现在就让你分清楚。

Prim

当然题目设问里也会有让你写出算法思想。
P的算法思想就是:从某顶点(已生成的最小生成树)出发,选择与该生成树最近的顶点加入该生成树,重复直到所有顶点都加入为止。

Kruskal

K算法思想:从边出发,以边的小到大选择,当该边处于两个不同的连通分量上,则加入该边,形成生成树,直至所有顶点都加入为止。

总之。在这一点问题上是绝对不能迟疑的,Prim比Kruskal短,点比边短,所以Prim是从点出发,Kruskal是从边出发,就这样记吧。

2.B-树

关于B-树的删除这个问题真的是每次都在整理,每次都在迷茫,感觉写题就跟刮彩票一样,虽然确实每次也都对,但是总觉得非常的没底,干脆直接干透它。

B-树的一些规定

构造B-树

首先关于B-树非常清晰的一点就是,左孩子小于本身小于右孩子,这个主要应用于B-树的构造。
但是在构造的时候(实际上就是不断插入新结点):

结点内关键字个数是[m/2]-1<=n<=m-1(取上整)!

这个主要如果碰到3阶以上的B-树要注意的点。虽然很少,但是指不定就踩到了,例如5阶的B-树,除了根节点可以只有一个结点以外,其他的结点关键字的个数就要在2-4之间(4很好懂啊,5个分支4个节点嘛)
那么这两个点稍微注意一下,接下来就是普通的向上分裂了。

删除结点

最头疼的莫过于删除结点,我真的每次都试探性删除,生怕试探错了,非常浪费时间

非终端结点

直接删去用前驱或者后继结点取代,然后转化为终端结点问题

终端结点

当我们转化为终端结点的时候,幺蛾子这个时候就来了。
关于删去终端结点一共有以下几种情况。
A.删除之后结点内关键字仍然满足之前提到的关键字限制,那么直接删之后啥也不用做
但如果删除之后不满足关键字限制(例如3阶删空,5阶删到只剩1个),这个时候我们就需要考虑外借了。
跟谁借,跟兄弟借,但不能直接把人家的抢过来,我们得通过爸妈跟兄弟借,我们不好意思开口。
B.够借
如果够借,我们先把父结点的拿过来,再由父结点向兄弟要。
C.不够借
好,如果连兄弟都没有我们该怎么办。
合并。
该怎么合并,我们一家人合并到一起(节点本身,父节点,兄弟节点)。
思路已经大概理清楚了:

能不能直接删?
不能直接删的话,能不能借?
不能借,我就合并

理论已经有了,接下来我们把解题的方法捋一遍
对于题目的方向主要就是两种,第一种是删除非终端结点,第二种就是删除终端节点。
其实两种都可以看成终端节点删除,如果是非终端节点删除,我们就可以忽略其孩子,而直接看成终端节点删除。
例如我们拿到了一棵3阶B-树
在这里插入图片描述画的有点丑了。。。我在手机上画的
我们首先删掉结点51,发现他是终端节点,也没法借,这个时候我们就进行合并。但要注意,合并是往下合并(就相当于我把58下拉,58的位置空出来),这个时候就要相当与在58的位置删去,再借,我们忽略孩子们都不看,在终端结点的基础上进行考虑,发现,可以借。则把25往上拉,40拉到58的位置。最后再调整孩子位置,让其符合B-树的规律,记住,是整体移动。如图
在这里插入图片描述这个时候我们在此基础上把16删掉,类似,忽略孩子节点不看,我们需要把25,40合并,往下拉,我们发现,根节点没了,这个时候就可以直接不要根节点的空位而使合并的结点作为根节点。再调整孩子节点位置。
PS:上图33 36是一个孩子节点,我画的太近了
对于16删除的12 21 我们发现分开了,那为了符合B-树的要求我们只能将其合并,放在25的左孩子处,最终结果如下。
在这里插入图片描述到此,删除讲清楚了吗。你们如果懂了我很可能做到新题。。。。就又不懂了,到时候我推导的过程再放上来。如果你有什么更好的方法也欢迎留言,让我学习学习。

且听下回分解。。。。还没结束

在不断写真题的过程中,我发现会有很多自己本以为懂了的东西却无法利用。或者是记混了或者是不记得。所以只能通过不断地总结加深自己的记忆
这个月主要的内容可能都与数据结构有关,因为我这个月打算重点攻克一下数据结构一些大块的知识点可能会出现的一些细节问题。
当然可能也会有一些计算机组成原理的东西,这个看我个人的情况。
欢迎你的留言,欢迎一起讨论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值