数据结构(包括图论)
文章平均质量分 51
数据结构的笔记
&不白熊
一头不白熊
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
拓扑排序求图的关键路径
例如该图中红线的路径就是关键路径;,例如工厂生产产品最短时间。关键路径主要用于判断。原创 2024-09-02 15:06:50 · 368 阅读 · 0 评论 -
霍夫曼树和霍夫曼编码
如图:将左子树的路径全部改为0,右子树改为1,到达该字母的数字就是该字母分配的霍夫曼编码。比如有一个字符串A(出现了5次)B(15)C(40)D(30)E(10)是一种文件压缩形式,是通过构建霍夫曼树形成的。通过这种编码,可以将原本的编码缩短。例如A(01), D(00),将一个字符串用树存储。原创 2024-09-02 14:32:22 · 276 阅读 · 0 评论 -
Tarjan(寻找强连通分量)
1,首先进行DFS,用数组dfn存储节点的遍历顺序:dfn[a] = 1,dfn[b] = 2 ……2,接着从遍历最低层 —— d 来迭代可到的的最小层次(low[n]),例如 d 可以回到 b ,3,如果发现无法迭代,则输出,例如回溯到 b 时,b 无法变为更小的数字,那就输出d c b,而dfn[b] = 2,小于dfn[d],那么就将 low[d] 设置为2,利用dfs产生的树,如果最底层节点能回到高层节点,那么他们就连通。3,如果进入的节点 dfn == low ,那么就证明该输出了。原创 2024-08-15 17:15:54 · 525 阅读 · 0 评论 -
树状数组相关
用一个数组t[x]存储以x为根节点的点的sum。与线段树相似,但是没有线段树扩展性好。树状数组的优点是实现较快。原创 2024-08-14 19:32:57 · 941 阅读 · 0 评论 -
Kahn拓扑排序
的所有顶点的线性序列。原创 2024-08-13 15:03:31 · 528 阅读 · 0 评论 -
ST表相关
线段树适用于需要频繁修改数组元素且需要实时查询区间信息的情况。由于其具有较快的查询和更新能力,因此。ST表用二维数组存储数据,st[x][y] = z 表示x到y的最大值为z。:ST表适用于数据确定之后不再更改,但需要大量查询的情况。,一旦数据发生变化,就需要重新进行预处理。原创 2024-08-13 14:00:50 · 363 阅读 · 0 评论 -
线段树相关
线段树适用于需要频繁修改数组元素且需要实时查询区间信息的情况。由于其具有较快的查询和更新能力,因此。线段树是一种二叉搜索树,每个节点表示为【x,y】 = z(x到y的最大值为z):ST表适用于数据确定之后不再更改,但需要大量查询的情况。根节点【1,6】表示第一个到第六个的最大值为 8。例如将 {1,8,6,4,3,5} 存入线段树为。,一旦数据发生变化,就需要重新进行预处理。ST表不支持动态修改操作。原创 2024-08-13 13:35:21 · 240 阅读 · 0 评论 -
Trie树(字典树、前缀树)
树的每个节点只有一个char,从根节点到一个叶子节点为一个字符串。trie树经常用于字符串的处理。1,判断是否具有对应字符。3,如果没有则创建新节点。2,如果有则共享节点。原创 2024-08-13 13:09:27 · 222 阅读 · 0 评论 -
求图是否存在闭环
(while(y!= father[]y) y = father[y])的父节点设置为x。3,遍历结束后如果每一个x,y的祖先节点都不一样,那么就不存在闭环。2,遍历所有的边,如果x,y节点的祖先节点一样,就证明存在闭环。如果祖先节点不一样,就将y的。原创 2024-07-29 18:02:38 · 384 阅读 · 0 评论 -
图的最小生成树
2,从最小的边开始遍历,如果左右节点祖先一样,就证明会构成回路,如果不一样,就添加到最小生成树中。2,将里树最近的一条路径添加进去(如果相同则任意一个都行)最小生成树就是找到没有回路的一条路径,而且权值相加最小。3,直到遍历结束,成功的边就是最小生成树了。主要有prim算法和kruskal算法。3,不断重复2直到覆盖到所有节点。prim算法主要运用贪心的思想。1,确定起始点,添加到树里。主要涉及到一个查并集的操作。1,将所有边从小到达排序。原创 2024-07-29 17:52:56 · 429 阅读 · 0 评论 -
图的最短路径算法
原理也十分简单:从a到b和a到c加上c到b一样,可以通过这一点,将c用所有节点代替,然后每次循环判断整个图,循环中更新,最后将所有自最短路径改为0即可。3,然后遍历图中可到达的节点Point B,判断dis[B]是否大于dis[A] + A到B的距离,然后更新dis。算法主要用到两个数组,一个dis[999]存储最短路径,一个check[999]存储每个节点是否更新。循环2,3,4直到全部check之后,dis中的就是A到达所有节点的最短距离。1,初始化dis,起始点设置为0,其他为无穷大,将起始点入队。原创 2024-07-28 17:02:56 · 629 阅读 · 0 评论 -
图的遍历(邻接表存储)
图的遍历一般只能统计节点的属性,不能用于最短路径。注意这个check要仍在外面。原创 2024-07-27 21:17:40 · 157 阅读 · 0 评论 -
二叉树的遍历
可以看到只有输出位置变化了,其他没有变化。他们一个是进行到底,一个是全面进行。只需要遍历数组即可,所以这里只给出。另外,BFS和DFS也经常用到。广度优先遍历(层次遍历)根的_date的位置。原创 2024-07-27 19:17:39 · 211 阅读 · 0 评论 -
图的存储结构
邻接矩阵邻接矩阵图的邻接矩阵(Adjacency Matrix) 存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。用一个二维数组存储两个节点是否连通,再用一个数组存储每个节点的元素的_date下面是实现以下图的代码。原创 2024-07-27 17:03:52 · 334 阅读 · 0 评论 -
树的存储结构
只有完全二叉树(满二叉树,大小堆)才能使用顺序存储,因为他的存储形式固定。下面是用最易懂的方式实现最简单的二叉树。dad * 2 + 2 = 右孩子。dad * 2 + 1 = 右孩子。dad * 2 +1 = 左孩子。dad * 2 = 左孩子。最常见以一种存储方式。原创 2024-07-27 16:04:40 · 278 阅读 · 0 评论 -
图的基本概念
在有向图中,顶点的度分为入度(Indegree,指向该顶点的弧的数量)和出度(Outdegree,从该顶点出发的弧的数量)。在有向图中,若存在弧<v, w>,则称v邻接到w,w邻接于v。:若从顶点vi到vj的边有方向,则称为有向边或弧,用有序偶<vi,vj>来表示,vi称为弧尾,vj称为弧头。图一般表示为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。:在有向图中,若任意两个顶点都存在双向路径,则称该图为强连通图。:在无向图中,若任意两个顶点都存在路径,则称该图为连通图。原创 2024-07-27 15:36:05 · 987 阅读 · 0 评论 -
多叉树的分类
B 树和B+树的主要区别是:B树的节点里包括(next指针,key-value键值对(或者直接用date存储数据)),总之B树的每个节点都存储了数据。4,每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。而在5,11子节点中,左侧是小于5的,中间是大于5但是小于11的,右侧是大于11的。且叶子节点是一种双向链表的形式,B+树的分支节点是用来选择的,省略了date的空间。可以看到B树是有顺序的,即22的左侧为小于22的,右侧为大于22的,原创 2024-07-26 17:31:32 · 746 阅读 · 0 评论 -
二叉树的分类
完全二叉树二叉树是最常见的树,二叉树的每个节点最多只有两个子节点二叉树的分类完全二叉树指二叉树的所有节点按照从左往右填充是一种完全二叉树,当完全二叉树每个层次都被填满时,就是满二叉树例如上图中的最后一棵树堆堆是一种带有特定排序的完全二叉树,所有节点大于他的所有子节点(大根堆),所有节点小于他的所有子节点(小根堆二叉搜索树二叉搜索树跟大/小根堆相似,堆只要求节点大于(小于)子节而二叉搜索树要求 左节点 > 节点 > 右节点平衡二叉树平衡二叉树是二叉搜索树的一种改进形式。原创 2024-07-25 18:14:12 · 1405 阅读 · 0 评论 -
树的基本概念和术语
把它叫做“树”是因为它常看起来像一棵倒挂的树,也就是说它常是根朝上,而叶朝下的。:从根结点开始,根结点的层次为1,根的直接后继层次为2,以此类推。:若一个节点含有子节点,则这个节点称为其子节点的父节点。A的层次为1,B的层次为2,E的层次为3,K的层次为4。该树的度为3,因为节点最大的为A和D,均有三个子节点。:具有同一父节点的各节点彼此是兄弟节点。即一个节点所拥有的子节点的数量。父节点也是相对的,例如B是E的父节点。图中的叶子节点为K,L,G,I,J。:一个节点含有的子树的根节点。原创 2024-07-24 20:50:48 · 928 阅读 · 0 评论 -
栈,队列,链表
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。原创 2024-07-25 15:31:13 · 932 阅读 · 0 评论
分享