408数据结构自己总结


打一遍那些比较难懂的知识点、公式和算法,来帮助自己记忆、理解以及快速回顾

C 2 n 2 / ( n + 1 ) {C^2_{2n}/(n+1)} C2n2/(n+1)

KMP模式匹配

其实只要会算next数组就可以啦

平衡二叉树

定义

任意节点的左右子树高度绝对值不大于1,左子树与右子树的高度差称为平衡因子

平衡方法

当插入新节点时,先检查有无破坏性质,若破坏了,找到离插入节点最近的平衡因子绝对值大于1的节点,让他作为根,设为A,来调整他的子树,然后会有以下四种情况,这四种情况名字很好记和对应不平衡的原因联系起来记比价好记,具体的操作直接看名字就能记忆,结合例子懂得更深。

LL,即A的左孩子的左子树插入了导致不平衡(下面的都同理就不写了),用一个右旋即可

RR,用一个左旋

LR,先左旋再右旋,这个左旋是子树的旋,后面右旋是A的旋

RL,先右旋再左旋

线索二叉树

哈夫曼树

定义

哈夫曼树可以解决如下问题:给定N个带权值的叶子节点,如何构造出一个带权路径长度(WPL)最小的二叉树,带权路径即从根节点到叶子节点经历的边的数量乘叶子节点的权值。此外,这种二叉树也就是哈夫曼树的定义。

构建

构建其实很简单,下面以二叉哈夫曼树为例 给n个点,每个点都有权值,构造一棵哈夫曼树。每次选剩下的两棵根权值最小的树合并成一棵新树,新树的根权值等于两棵合并前树的根权值和。(一开始一个点也看成一棵树,只不过这棵树没有孩子节点)

image-20211025151053491

哈夫曼树中只有度为0和度为2的节点,且n0=n2+1(这个的证明很简单,因为度为1的节点不会产生新的叶节点,一个度为2的产生一个叶子节点,再加上原本的根节点就得到这个公式了,然后哈夫曼树是最优二叉树所以没有度为1的节点)

哈夫曼编码

一篇电文,原文为:AMCADEDDMCCAD。现在要把原文转换成01串发送给对方。为了节省资源,我们当然希望翻译好的01串长度尽量的短。怎么办?

分析,我们当然希望用的最多编码的串更短,并且不能出现歧义(这时候就要用前缀码了,即没有一个编码是其他编码前缀的编码),这样的话正好就可以用哈夫曼树了,将出现次数视为权值,然后来做

img

树、森林和二叉树互换

有时候我一直很困惑树和森林的区别是什么,其实森林就是m棵互不相交的树的集合,树删掉了根节点就变成了森林。

树转换为二叉树

左兄弟右孩子,所以转换出来的二叉树没有右子树

img

森林转换为二叉树

把每一个树转换为二叉树,然后再根据左孩子右兄弟来转换(根视为兄弟),这个逆过程也得会,稍微思考一下就懂了。

二叉树转换为森林

将右孩子断了,然后将,再对断了的右子树递归进行此操作直到没有右子树为止。然后再对每一个树转换为二叉树。

树的先序遍历与其转换的相应的二叉树的先序遍历的结果序列相同;树的后序遍历与其转换的二叉树的中序遍历的结果序列相同;树的层序遍历与其转换的二叉树的后序遍历的结果序列相同。由森林与二叉树的转换关系以及森林与二叉树的遍历定义可知,森林的先序遍历和中序遍历与所转换得到的二叉树的先序遍历和中序遍历的结果序列相同

堆排序(其实也是二叉树的应用)

堆一般是一种完全二叉树,分为最大堆和最小堆,最大堆即每个父节点都大于子节点,最小堆同理。

堆排序顺序,创建堆,调整堆,堆排序。

主要是后两部,调整堆即把一个堆变成最大/最小堆,堆排序即将排好的堆的根以此输出(交换元素),并且要维持堆的性质不变。

调整堆

这个调整是一切的基础,以最大堆距离,简单来说是一个迭代的过程,从最后一个元素往前开始,要是此元素小于左右子树的最大值,就把根与该值交换,不断重复直到完全满足要求。

preview

堆排序(交换元素)

将根与最后一个没排序好的元素交换,此中要一直保持堆的性质不变

preview

插入元素

插入先插入末尾,然后向上执行调整操作

B+树

B树和B+树是一种查找的手段,主要解决磁盘读取慢的问题

图的应用

拓扑排序

可以先修课程,即没修某门课不能上一门课

生成方法:1.选择一个没有前驱的顶点并输出2.删除该顶点和所有以它为起点的边,然后重复以上过程

做题数有几个拓扑排序可以采用树的方法,这样比较清晰,不多谈,你应该懂得。

索引表查找

这个我个人觉得可以理解为二维的二分查找,懂了这个之后就很容易推了,假设一共有n个元素,那么就分成n1/2组,每组n1/2个元素,先对组进行查找,再在组内进行查找。

折半查找最多次数为log2N(向下取整)+1

AVL:二叉查找树(Adelson-Velsky-Landis Tree):是带有平衡条件的BST

BST:二叉排序树(Binary Search Tree):左子树值<=根值<=右子树

查找最多次数为log2N(向下取整)+1

AVL:二叉查找树(Adelson-Velsky-Landis Tree):是带有平衡条件的BST

BST:二叉排序树(Binary Search Tree):左子树值<=根值<=右子树

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值