![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 90
夜槿笙歌
这个作者很懒,什么都没留下…
展开
-
拓扑排序与关键路径
简单来讲,对于下面这张图,要想访问到B点,就必须先访问A点;要想访问E点,就必须先访问B点和C点…拓扑排序就是在保证各节点的优先级顺序不被打乱的前提下,遍历整张图的节点。拓扑排序形成的拓扑序列不一定只有一条。比如下面这张图的拓扑序列可以是:,也可以是。如果图的所有节点都遍历到了,那么这就是一张无环图;但如果有节点没有被遍历到,那么这张图一定存在环。拓扑排序的算法流程很简单:从图中找到一个入度为0的节点输出,然后删除这个顶点(包括依赖它的边)。重复此步骤,直到图中不存在入度为0的节点为止。以前面的图为例。在原创 2022-12-07 21:33:06 · 1369 阅读 · 0 评论 -
最短路径(Dijkstra算法与Floyd算法)
Dijkstra算法与之前学习过的Prim算法有些相似之处。我们直接通过一个例子来讲解假设要求的是A->E之间的最短路径。首先我们来列出顶点A到其他各顶点的路径长度:。既然是要寻找最短路径,我们当然是先在已有的路径里面挑一条最短的,也就是。将到达过的顶点用红色进行标识到达C点后,我们又可以找到两条路径:。此时我们拿这几条新的路径长度,与之前的相加,就可以得到。出现了一条比之前短的路径:。所以我们将其更新到之前的路径列表里:。接下来再从路径列表里选择一条最短的路径,也就是:。将D标记为已到达。到达D点后原创 2022-12-04 22:39:09 · 3355 阅读 · 0 评论 -
最小生成树(Prim算法与Kruskal算法)
一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树称为最小生成树。例如下图中①、②、③都是左侧图的生成树,但③是构造连通网的最小代价,所以③是该图的最小生成树。原创 2022-11-29 21:17:48 · 3106 阅读 · 0 评论 -
图的存储方式
图的邻接矩阵存储方式就是用两个数组来表示图。一个一维数组存储图的顶点信息,另一个二维数组存储图中边的信息。对于无向图来说,我们可以用1表示两顶点相连,用0表示两顶点不相连。任意顶点的度为邻接矩阵中该节点的行或列的元素之和。对于有向图,任意顶点的入度为其对应列的元素之和,出度为其对应行的元素之和。对于有权图,可以将邻接矩阵中的元素存储为权值。对于不可达的顶点,可以用一个权值不可能达到的极限值表示。代码如下原创 2022-11-23 20:27:26 · 1555 阅读 · 0 评论 -
哈夫曼树及其应用
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。——摘自百度百科要理解哈夫曼树,首先需要理解什么是“带权路径长度”:一棵树中一个节点到达其子孙节点之间的通路称为路径。通路中的分支数目称为路径长度。从根节点到第L层节点的路径长度为L-1。例如上面这棵树中,从17->6的路径长度为3,从14->6的路径长度为2。:从根节点到该节点之间的路径长度与该节点的权的乘积。原创 2022-11-15 20:00:08 · 2445 阅读 · 0 评论 -
线索二叉树与Morris遍历
对于一棵普通的二叉树,它的节点结构需要由两个指针域和一个数据域构成。而一棵树中必定存在一些指针域没有被使用到,这就造成了空间的浪费。另一方面,我们经常用到二叉树的前、中、后序遍历,如果想求某种遍历中某个节点的前驱和后继节点,那就需要重新进行遍历。这无疑会造成时间的浪费。所以为什么不把空闲的指针域利用起来,让其指向节点的前驱或后继呢?其实这就是线索二叉树的核心思想。我们以中序遍历为例进行讲解。原创 2022-11-09 21:41:50 · 743 阅读 · 0 评论 -
KMP模式匹配算法
给定字符串M和N,求M中是否包含N,如果包含,则返回N在M中的起始位置对于上面这道题目,我们很容易就能想到如下解法:M和N各自维护一个指针。首先P1指针向右遍历,寻找与P2指针相同的字符然后P2与P1同时向右移动,并一一比对所指字符是否相同一旦遇到不相同的字符,则停止遍历。P2回到初始位置,P1则回到此轮遍历开始时的下一个位置,然后继续前面的过程。直到找到完全匹配的位置代码如下显然这种匹配方式的效率并不高,因为每当匹配失败,都需要进行回溯并重新开始匹配。原创 2022-11-05 22:27:55 · 825 阅读 · 0 评论 -
二叉树的遍历
提到二叉树的遍历,最常见的有以下几种方式:前序遍历:根->左->右中序遍历:左->根->右后序遍历:左->右->根层序遍历:从左到右,从上到下遍历根节点在开始讲解前,我们先定义好树节点的结构原创 2022-10-05 22:03:19 · 637 阅读 · 0 评论 -
矩阵快速幂
从快速幂到矩阵快速幂原创 2022-09-08 14:37:35 · 3361 阅读 · 0 评论 -
滑动窗口算法
文章目录前言滑动窗口总结前言在引入滑动窗口的概念之前,我们先看一道例题:给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。(LeetCode 3. 无重复字符的最长子串)拿到这道题最容易想到的解法就是暴力枚举。即从字符a1a_1a1开始遍历,当遇到与a1a_1a1相同的字符a2a_2a2时,记录下最长子串长度,指针再回到a1a_1a1字符的下一个位置,重复上述流程…代码如下:public int lengthOfLongestSubstring(String s)原创 2022-04-23 21:37:50 · 18240 阅读 · 2 评论 -
常见排序算法汇总
整理一下之前学习的各种排序算法原创 2022-04-17 16:44:44 · 8292 阅读 · 2 评论 -
AVL树详解
二叉搜索树有了经典的二叉搜索树做铺垫,我们就可以正式开始讲解由它衍生出的几种改进的二叉搜索树结构。首先是AVL树,也就是我们常说的平衡二叉树。从名字就可以看出,AVL树是一种高度平衡的二叉搜索树,即任意节点的左子树和右子树高度之差都不超过1。那么我们为什么要让一棵二叉搜索树尽量平衡呢?我们假设现在有一组输入数据[1,2,3,4,5],按照先前的插入逻辑,就会形成如下结构的二叉树:这棵树的高度和它的元素个数是一致的,因为二叉搜索树各种操作所消耗的时间与其高度密切相关,因此这棵树所形成的的结构显然不是我们想看到原创 2022-06-05 12:10:32 · 5510 阅读 · 0 评论 -
二叉搜索树
二叉搜索树是指一棵树的左子树上所有的节点都小于它的根节点;右子树上所有的节点都大于它的根节点。且对于它的所有子树都是如此。基于这个性质,当我们对二叉搜索树进行中序遍历时,就可以得到有序的序列。根据二叉搜索树的性质,当需要新增元素时,我们只需要判断这个元素是大于根节点还是小于根节点。如果是大于,则在右子树中继续寻找;如果是小于,则在左子树中继续寻找,直到找到适合自己的空位。代码如下:查找查找就比较简单了,跟新增有些类似。从根节点开始,如果当前节点小于新节点,就从右树上继续查找;如果当前节点大于新节点,就原创 2022-06-05 12:04:42 · 351 阅读 · 0 评论