【数据结构】数据结构大汇总 {数据结构的分类总结:定义和特性、实现方式、操作与复杂度、适用场景、相关算法、应用实例}

一、线性结构

1.1 顺序表

在这里插入图片描述

  1. 定义和特性:顺序表是一种线性表的存储结构,它采用一段地址连续的存储单元依次存储线性表中的元素。顺序表具有随机访问的特性,即可以通过元素的下标直接访问元素。

  2. 实现方式:顺序表可以通过数组来实现,数组的下标即为顺序表中元素的位置。实现方式简单高效,支持常数时间的随机访问。

  3. 操作与复杂度:顺序表支持基本的插入、删除、查找等操作。其中,随机访问的时间复杂度为O(1),顺序查找的时间复杂度为O(n),插入和删除操作的时间复杂度为O(n)。顺序表的空间复杂度为O(n)。

  4. 适用场景:顺序表适用于元素个数固定或变化不大的情况,以及需要经常进行随机访问而不太频繁插入和删除操作时效果较好。由于对内存的连续性要求,对于较大的动态数据集合,可能需要频繁扩展内存并进行数据移动,会影响性能。

  5. 相关算法:顺序表的算法包括顺序查找、二分查找等,这些算法可以利用顺序表的特性进行实现,提高查找效率。

  6. 应用实例:顺序表广泛应用于程序开发中,例如在一些编程语言中的数组就是采用顺序表的方式实现的。在内存中,数组也是一种顺序表的典型表示方式。

【数据结构和算法】顺序表(动态顺序表、头插、尾插、任意位置插入、头删、尾删、任意位置删除、遍历查找、二分查找)_顺序表头部插入-CSDN博客

1.2 链表

在这里插入图片描述

  1. 定义和特性:链表是一种线性表的存储结构,它由一系列节点组成,每个节点包含数据元素和指向下一个节点的指针。链表可以分为单向链表、双向链表和循环链表等不同类型。链表的特点是不要求内存空间连续,可以动态地分配和回收内存,因此适用于频繁插入和删除的场景。

  2. 实现方式:链表通过节点之间的指针来实现元素之间的连接。每个节点包含一个数据元素和一个指向下一个节点的指针(双向链表还包含指向前一个节点的指针)。链表的实现方式相对灵活,可以随时动态改变链表的结构。

  3. 操作与复杂度:链表支持基本的插入、删除、查找等操作。插入和删除操作的时间复杂度为O(1),查找操作的时间复杂度为O(n)。链表的空间复杂度为O(n),每个节点需要额外的存储空间来存储指针。

  4. 适用场景:链表适用于频繁插入和删除操作的场景,以及对内存空间要求不连续的场景。在实际应用中,例如在实现队列、栈、哈希表等数据结构时,常常会使用链表来实现。

  5. 相关算法:链表的相关算法包括反转链表、合并两个有序链表、检测链表是否有环等。这些算法都是基于链表特性的实现,对于某些问题提供了较为高效的解决方案。

  6. 应用实例:链表广泛应用于计算机科学中,例如在操作系统中的进程调度、在数据库中的存储结构、在图形学中的多边形表示等都有链表的影子。此外,许多编程语言的标准库中也包含了链表的实现。

【数据结构和算法】链表(顺序表 VS 链表、8种链表结构、单链表、双向链表)-CSDN博客

【数据结构和算法】单链表(无头单向非循环链表、单链表的增、删、查、改等基本操作、单链表的图形表示、带哨兵位的单链表)_带哨兵的单链表的示意图-CSDN博客

【数据结构和算法】双向链表(带头双向循环链表、“增、删、查、改”基本操作)_循环双链表的插入删除-CSDN博客

1.3 栈 & 队列

在这里插入图片描述
在这里插入图片描述

  1. 定义和特性:

    • 栈(Stack)是一种后进先出(LIFO)的数据结构,只允许在栈顶进行插入(入栈)和删除(出栈)操作。

    • 队列(Queue)是一种先进先出(FIFO)的数据结构,允许在队列的一端插入元素(入队),另一端删除元素(出队)。

  2. 实现方式:

    • 栈可以使用数组或链表来实现。数组实现的栈称为顺序栈,链表实现的栈称为链式栈。

    • 队列同样可以使用数组或链表来实现。数组实现的队列称为顺序队列(循环队列),链表实现的队列称为链式队列。

  3. 操作与复杂度:

    • 栈的基本操作包括入栈和出栈操作。入栈和出栈的时间复杂度均为O(1)。

    • 队列的基本操作包括入队和出队操作。入队和出队的时间复杂度均为O(1)。

  4. 适用场景:

    • 栈适用于需要后进先出的场景,例如函数的调用栈、表达式求值、括号匹配等。

    • 队列适用于需要先进先出的场景,例如任务调度、消息传递等。

  5. 相关算法:

    • 栈的相关算法包括中缀表达式转后缀表达式、非递归函数的实现、深度优先搜索等。

    • 队列的相关算法包括广度优先搜索、实现缓存、任务调度等。

  6. 应用实例:

    • 栈的应用场景包括浏览器的历史记录、编辑器的撤销操作、系统调用的存储等。

    • 队列的应用场景包括消息队列、生产者消费者模式、打印任务队列等。

【数据结构和算法】栈和队列_-CSDN博客


二、树形结构

2.1 堆

在这里插入图片描述

  1. 定义和特性:堆(Heap)是一种特殊的树形数据结构,它满足堆属性:对于堆中任意节点i的值都要大于等于(或小于等于)其子树中每个节点的值。根据堆属性的不同,堆可以分为最大堆(每个节点的值大于等于其子节点的值)和最小堆(每个节点的值小于等于其子节点的值)。

  2. 实现方式:堆通常使用数组来实现,将父节点和子节点的关系映射到数组的索引上。这种实现方式可以较为高效地进行插入和删除操作,并且能够满足堆的性质。

  3. 操作与复杂度:堆主要支持插入元素、删除元素、查找堆顶元素等操作。插入和删除的时间复杂度为O(log n),其中n为堆中元素的个数。查找堆顶元素的时间复杂度为O(1)。

  4. 适用场景:堆适用于需要快速找到最大值或最小值的场景,例如优先级队列、堆排序、定时器事件等。

  5. 相关算法:堆的相关算法包括向下调整建堆O(n)、堆排序O(nlogn)、Top k 问题(寻找前k大或前k小的元素)等。

  6. 应用实例:堆广泛应用于计算机科学中,例如操作系统的进程调度、网络通信的数据包传输、图算法中的Dijkstra算法等都可能用到堆结构。

【数据结构和算法】树和二叉树(树的概念及结构、二叉树概念及结构)_二叉树和树的结构-CSDN博客

【数据结构与算法】二叉树的顺序结构—堆(堆的基本实现,TopK问题,堆排序)-CSDN博客

2.2 AVL树

在这里插入图片描述

  1. 定义和特性:AVL树是一种自平衡二叉搜索树,它满足平衡因子的限制:对于AVL树的任意节点,其左子树高度与右子树高度之差的绝对值不超过1。通过维持平衡因子的要求,AVL树能够保持树的高度较小,以提高查找等操作的效率。

  2. 实现方式:AVL树的实现方式与普通的二叉搜索树类似,每个节点包含一个关键字和左右子节点的指针。当进行插入或删除操作时,需要通过对节点进行旋转和调整,使树保持平衡。

  3. 操作与复杂度:AVL树支持插入、删除、查找等基本操作,这些操作的时间复杂度为O(log n),其中n为树中节点的数量。由于AVL树的平衡性质,对于平衡的AVL树,查找操作的平均时间复杂度为O(log n)。

  4. 适用场景:AVL树适用于需要频繁执行插入、删除和查找操作,并且对查询性能要求较高的场景。例如,在数据库的索引结构、编译器中的符号表、字典等应用中常使用AVL树以提高查询效率。

  5. 相关算法:AVL树的相关算法包括插入操作、删除操作、平衡操作等。这些算法通过对树的旋转、调整和重平衡等操作来维持树的平衡性。

  6. 应用实例:AVL树在计算机科学中有广泛的应用,例如在数据库系统中用于索引,以提高查询和排序的效率。此外,在编程语言的标准库中,也常常包含AVL树的实现。

【数据结构和算法】二叉树的链式结构(二叉树的创建、销毁;二叉树的前中后序遍历;求二叉树的高度;求二叉树节点、叶子节点、第K层节点的个数;查找二叉树节点;判断是否是完全二叉树)-CSDN博客

【高阶数据结构】二叉搜索树 {概念;实现:核心结构,增删查,默认成员函数;应用:K模型和KV模型;性能分析;相关练习}-CSDN博客

【高阶数据结构】AVL树 {概念及实现;节点的定义;插入并调整平衡因子;旋转操作:左单旋,右单旋,左右双旋,右左双旋;AVL树的验证及性能分析}-CSDN博客

2.3 红黑树

在这里插入图片描述

  1. 定义和特性:红黑树是一种自平衡的二叉搜索树,它在满足二叉搜索树的性质的同时,引入了颜色标记和一些额外的规则来保持树的平衡。红黑树具有以下特性:

    • 每个节点都有一个颜色,可以是红色或黑色。
    • 根节点是黑色的。
    • 所有NIL结点都是黑色的。(NIL节点即空结点,空树也是红黑树)
    • 如果一个节点是红色的,则它的两个子节点都是黑色的。
    • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
  2. 实现方式:红黑树的实现方式基于二叉搜索树的基本结构,同时引入颜色标记和旋转操作,以确保树始终保持平衡。在插入或删除节点时,需要对树进行调整,通过变换节点的颜色和进行旋转来维持红黑树的性质。

  3. 操作与复杂度:红黑树支持插入、删除、查找等基本操作,这些操作的最坏情况下的时间复杂度为O(log n),其中n为树中节点的数量。由于红黑树的平衡性质,查找操作的平均时间复杂度也为O(log n)。

  4. 适用场景:红黑树适用于需要频繁执行插入、删除和查找操作,并且对平衡性能要求较高的场景。例如在STL中的map和set容器的实现中,通常会采用红黑树作为底层数据结构。

  5. 相关算法:红黑树的相关算法包括插入节点、删除节点、旋转操作、颜色翻转等。这些算法通过对节点进行旋转和颜色变换来维护红黑树的平衡性。

  6. 应用实例:红黑树在计算机科学中有广泛的应用,如在数据库系统中用于索引、在编程语言的标准库中用于实现map、set等容器等。

【高阶数据结构】红黑树 {概念及性质;红黑树的结构;带头结点的红黑树;红黑树的实现;红黑树插入操作详细解释;红黑树的验证}_红黑树抽象数据结构-CSDN博客

2.4 哈夫曼树

在这里插入图片描述

  1. 定义和特性:哈夫曼树是一种特殊的二叉树,它是一种最优二叉树,用于编码和解码一组字符。哈夫曼树的特性是:权值越大的节点离根节点越近,而权值越小的节点离根节点越远。这种特性保证了哈夫曼树的前缀码性质,使得编码和解码过程简单高效。

  2. 实现方式:哈夫曼树通常通过贪心算法构建。构建过程中,首先创建一个只包含单个字符节点的森林,然后选择两个权值最小的节点合并为一个新的节点,并把新节点的权值设为两个被合并节点的权值之和。重复此过程,直到森林中只剩下一个树,即为哈夫曼树。

  3. 操作与复杂度:哈夫曼树的主要操作是构建和编解码。构建哈夫曼树的时间复杂度为O(nlogn)(使用优先级队列选取最小权重的节点),其中n为字符集的大小。编解码的时间复杂度为O(m)(取决于字符在哈夫曼树中的深度),其中m为待编解码的字符串长度。

  4. 适用场景:哈夫曼树适用于需要对一组字符进行编码和解码的场景。例如在数据压缩算法中,哈夫曼树被广泛应用于无损压缩,将出现频率高的字符使用较短的编码表示,从而减小文件的大小。

  5. 相关算法:哈夫曼树的相关算法包括构建算法(如贪心算法)、编码算法和解码算法。构建算法通过合并节点来构建哈夫曼树,编码算法将字符映射到哈夫曼树上的路径,解码算法通过遍历哈夫曼树来还原字符。

  6. 应用实例:哈夫曼树在计算机科学中有广泛的应用。例如,在数据压缩算法中,如ZIP和GZIP等,使用哈夫曼树进行编码和解码以减小文件的大小。此外,在通信领域中,哈夫曼树也被用于数据传输的压缩和解压缩。

终于把哈夫曼树搞明白了(一)_哈夫曼树的引入_哔哩哔哩_bilibili

终于把哈夫曼树搞明白了(二)_什么是哈夫曼树?_哔哩哔哩_bilibili

终于把哈夫曼树搞明白了(三)_如何构造哈夫曼树?_哔哩哔哩_bilibili

终于把哈夫曼树搞明白了(四)_哈夫曼树的应用_哈夫曼编码_哔哩哔哩_bilibili

2.5 B树系列

B树
在这里插入图片描述
B+树
在这里插入图片描述
B*树
在这里插入图片描述

  1. 定义和特性:

    • B树:B树是一种自平衡的多路搜索树,其节点可以包含多个子节点。根节点至少有1个键,2个孩子;每个分支节点都包含k-1个键和k个孩子,其中 ceil(m/2) ≤ k ≤ m(ceil是向上取整函数);所有的叶子节点都在同一层;节点中的键按升序排列,节点当中k-1个键正好是k个孩子包含的元素的值域划分
    • B+树:B+树是在B树基础上做了改进的一种多路搜索树。分支节点的子树指针与关键字个数相同;B+树的分支节点只存储key不存储value,分支节点相当于是叶子节点的索引,叶子节点才是存储数据的数据层;分支节点中的关键字其实是对应子树中的最小值;所有叶子节点按照键的升序连接起来形成一个有序链表,方便范围查询和遍历。
    • B*树:B*树是在B+树基础上做了改进的一种多路搜索树。B*树对于非叶子节点的分裂不像B+树那样简单地将一半分裂给新节点,将中间键提升到上层节点(最少m/2)。而是在插入过程中如果当前节点满了,就将一部分数据移动到兄弟结点中,如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各移动1/3的数据到新结点(最少2/3m),以充分利用节点的空间,减少树的深度。
  2. 实现方式:B树、B+树和B*树的实现方式相似,基于多路搜索树的结构,节点中的键值对有序排列,并且保持树的平衡性质。在插入或删除节点时,需要对树进行调整,通过节点的分裂或合并来维持树的平衡。

  3. 操作与复杂度:这三种树结构的操作包括插入、删除、查找等,具有相似的时间复杂度。对于一棵节点为N,度为M的B树,查找和插入需要最少log{M}N次 ~ 最多log{M/2}N + 1次比较(M/2向上取整)。由于B+树和B*树叶子节点之间建立了有序链表,所以范围查询更加高效。

  4. 适用场景:B树(系列)是一种适合外查找的树,他通过提高节点度数、增加关键字个数,来压缩高度、减少查找次数,从而达到减少磁盘I/O操作的目的

  5. 相关算法:B树、B+树和B*树的相关算法包括插入、删除、节点分裂和合并等。这些算法通过调整节点的结构来保持树的平衡,并提高树的性能。

  6. 应用实例:B树、B+树和B*树在数据库系统、文件系统和操作系统等领域中有广泛的应用。

【高阶数据结构】B树 {B树的概念;B树的实现:节点设计,查找,插入,遍历,删除;B树的性能分析;B+树和B*树;B树的应用}-CSDN博客

2.6 并查集

在这里插入图片描述

  1. 定义和特性:并查集是一种数据结构,用于管理元素的分组和连接性。并查集中的每个元素都被视为一个节点,可以根据节点间的连接关系将它们分为若干个不相交的集合。并查集具有以下特性:

    • 支持两种操作:查找(find)和合并(union)。
    • 查找操作用于确定元素所属的集合,即找到元素的根节点。
    • 合并操作用于将两个集合合并成一个集合,即将其中一个集合的根节点指向另一个集合的根节点。
  2. 实现方式:并查集通常使用数组或树结构来实现。使用数组实现时,可以通过记录每个元素的根节点来表示集合的连接关系。使用树结构实现时,可以使用树的根节点表示集合,并按需连接不相交的集合。

  3. 操作与复杂度:并查集支持查找操作和合并操作,这两种操作的时间复杂度都可以达到接近O(1)的水平。这是因为在合并时,可以通过路径压缩和按秩合并等技术来尽量降低树的深度,从而提高查找和合并操作的效率。

  4. 适用场景:并查集适用于需要快速判断元素之间连接性的场景,比如在图论中用于判断图的连通性、Kruskal算法中用于最小生成树的构建、集合合并的问题等。

  5. 相关算法:并查集的相关算法包括查找操作、合并操作、路径压缩和按秩合并等。这些算法可以有效提高并查集的查询和合并性能。

  6. 应用实例:并查集在各种离散数学问题、图论问题和算法设计中有广泛的应用,如Kruskal算法、社交网络中的好友关系判断等。

【高阶数据结构】并查集 {并查集原理;并查集优化;并查集实现;并查集应用}_并查集,10w个人组成的多少个朋友圈-CSDN博客


三、哈希结构

3.1 哈希表

在这里插入图片描述

  1. 定义和特性:哈希表是一种数据结构,通过计算哈希函数,将键映射到存储桶中。它具有快速的查找、插入和删除操作,并且在理想情况下具有常数时间复杂度。哈希表由键值对组成,每个键唯一对应一个值。

  2. 实现方式:哈希表内部通常由一个数组和对应的哈希函数组成。哈希函数将键映射到数组的特定位置(存储桶)。在哈希冲突时,通常采用链表、平衡树等方式解决。

  3. 操作与复杂度:哈希表支持的基本操作包括插入(put)、查找(get)、删除(remove)等。在理想情况下,这些操作的时间复杂度为O(1),但在存在哈希冲突时,复杂度可能会退化。

  4. 适用场景:哈希表适用于需要快速查找、插入和删除操作,并且键值唯一的场景中。它在处理大规模数据中通常具有很高的性能。

  5. 相关算法:哈希表与哈希函数相关联,其设计和优化都与哈希函数密切相关。另外,哈希表也与哈希冲突解决算法相关,如拉链法、线性探测法等。

  6. 应用实例:哈希表在实际工程中广泛应用。例如,在编程语言中的哈希表数据结构,用于实现关联数组或字典;在数据库系统中的哈希索引,用于加速数据检索等。

【高阶数据结构】哈希表 {哈希函数和哈希冲突;哈希冲突的解决方案:开放定址法,链地址法;红黑树结构 VS 哈希结构}-CSDN博客

3.2 位图

在这里插入图片描述

  1. 定义和特性:位图是一种数据结构,它由一个二进制位数组或者比特数组组成,每个位(bit)只能存储 0 或 1。位图通常被用来表示大量整数的集合,通过位的状态来表示该整数是否出现在集合中。位图支持高效的位操作(如按位与、按位或、按位异或等),适合用于高效地存储和操作大量的布尔型数据。

  2. 实现方式:位图可以被实现为一个数组,其中每个元素都是一个字节,而每个字节又包含8个位。对于很大的位图,可以使用多个数组进行分段存储。位图通常不仅仅用于表示整数的集合,还可以用于标记某个特定值是否存在。

  3. 操作与复杂度:位图支持的基本操作包括设置某一位为 1,清除某一位为 0,或者测试某一位的状态等。因为位图的底层数据结构是二进制数组,所以这些基本操作可以在常数时间内完成。

  4. 适用场景:位图通常在需要高效地表示大规模的布尔型数据集合时使用。举例来说,它可以应用于网络流量分析、数据库索引、压缩算法、密码学等领域。

  5. 相关算法:位图与位运算相关紧密,通过位运算可以高效地对位图进行操作。这包括与、或、非、异或等操作。另外,位图所涉及的算法还包括位图的压缩算法、位图的搜索算法等。

  6. 应用实例:位图在实际工程中有多种应用。例如,在搜索引擎中,位图被用来表示网页的索引;在数据库系统中,位图索引可以用来加速查询操作;在计算机网络中,位图可以用于IP地址的查找。

【高阶数据结构】哈希的其他应用 {位图的介绍及实现,位图的组合应用;布隆过滤器的介绍及实现,布隆过滤器的应用;哈希切分}-CSDN博客

3.3 布隆过滤器

在这里插入图片描述

  1. 定义和特性:布隆过滤器是一种空间高效的数据结构,用于判断一个元素是否属于一个集合。它由一个位数组和多个哈希函数组成。插入元素时,将元素经过多个哈希函数映射到位数组上;查询元素时,通过同样的哈希函数映射到位数组上,如果所有对应位都为1,则可能存在该元素,如果有一个为0则一定不存在。因此布隆过滤器可能存在一定的误判率。

  2. 实现方式:布隆过滤器通常使用一个位数组表示,同时使用多个哈希函数来映射元素到位数组上。当插入元素时,对应的位被标记为1;当查询元素时,检查对应的位,如果所有位都为1,则可能存在该元素。

  3. 操作与复杂度:布隆过滤器支持的基本操作包括插入元素和查询元素。插入和查询的时间复杂度都是O(k),其中k为哈希函数的个数。布隆过滤器的空间复杂度与位数组的大小有关,但通常情况下是与预期容量和误判率相关的。

  4. 适用场景:布隆过滤器适合用于处理大量数据集合的成员关系查询,并且可以容忍一定的误判率。它在缓存、数据库查询、垃圾邮件过滤等领域有广泛的应用。

  5. 相关算法:布隆过滤器涉及的算法主要是哈希函数的选择和位数组的操作。另外,还有一些改进的布隆过滤器,如Counting Bloom Filter和Scalable Bloom Filter等。

  6. 应用实例:布隆过滤器在实际工程中有多种应用。例如,网络路由器使用布隆过滤器来快速决定一个给定IP地址是否合法;在分布式系统中,布隆过滤器可以用于降低分布式缓存中的缓存穿透问题。

【高阶数据结构】哈希的其他应用 {位图的介绍及实现,位图的组合应用;布隆过滤器的介绍及实现,布隆过滤器的应用;哈希切分}-CSDN博客


四、图形结构

4.1 概括总结

在这里插入图片描述

  1. 定义和特性:图是一种由节点(顶点)和节点之间的连接(边)组成的数据结构。图可以表示各种关系和网络结构,比如社交网络、道路网络等。图可以是有向的(边有方向)或无向的(边没有方向),可以是带权的(边有权值)或无权的(边没有权值)。

  2. 实现方式:图可以用多种方式来实现,常见的方式有邻接矩阵和邻接表。邻接矩阵是一个二维数组,其中数组的行和列代表图中的节点,矩阵中的元素表示节点之间的连接关系;邻接表是使用链表或数组来表示每个节点的邻居节点。

  3. 操作与复杂度:图支持的基本操作包括添加节点和边、删除节点和边、查找节点和边等。图的操作复杂度取决于具体的实现方式和操作类型。

  4. 适用场景:图是用于表示和解决各种复杂关系和网络问题的重要数据结构。它在网络分析、推荐系统、路径规划等领域有广泛的应用。

  5. 相关算法:图涉及的算法包括最短路径算法(如Dijkstra算法、Bellman-Ford算法)、最小生成树算法(如Prim算法、Kruskal算法)、图遍历算法(如深度优先搜索和广度优先搜索)等。

  6. 应用实例:图在实际工程中有多种应用。例如,在社交网络中,图可以用于表示用户之间的关系;在地图导航系统中,图可以用于表示道路网络和计算最短路径。

【高阶数据结构】图 {图的基本概念;图的存储结构:邻接矩阵,邻接表;图的遍历:BFS,DFS}-CSDN博客

4.2 图遍历算法

图遍历算法是用于在图结构中访问和处理所有节点的算法。常见的图遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。

  1. 深度优先搜索(DFS):

    • DFS是一种用于图遍历的算法,它从起始节点开始,一直沿着路径直到到达最深的节点,然后再回溯到上一个节点,继续探索下一个路径。DFS可以通过递归或者使用栈来实现。
    • 优点:实现简单,适用于寻找连通分量、拓扑排序等任务。
    • 缺点:不一定能得到最短路径,可能会陷入深层次的路径,不适合用于寻找最短路径的问题。
  2. 广度优先搜索(BFS):

    • BFS是一种用于图遍历的算法,它从起始节点开始,首先访问其所有相邻节点,然后再依次访问这些相邻节点的邻居节点。BFS可以使用队列来实现。
    • 优点:能够搜索最短路径,适用于寻找最短路径的问题。
    • 缺点:需要额外的空间来存储节点的信息,实现稍微复杂一些。

【高阶数据结构】图 {图的基本概念;图的存储结构:邻接矩阵,邻接表;图的遍历:BFS,DFS}-CSDN博客

4.3 最小生成树算法

最小生成树算法主要有Prim算法和Kruskal算法两种。

  1. Prim算法:

    • 从任意一个顶点开始,将其加入生成树中。
    • 选择与生成树相连的最短边,将其连接的顶点加入生成树中。
    • 重复以上步骤,直到所有顶点都已加入生成树为止。
  2. Kruskal算法:

    • 将所有边按照权值从小到大进行排序。
    • 依次取出权值最小的边,若该边连接的两个顶点不在同一连通分量中,则将其加入生成树中。
    • 重复以上步骤,直到生成树中包含了所有顶点。

这两种算法都是贪心算法,通过不断选择当前状态下的最优解来构建最小生成树。它们的时间复杂度分别为O(V^2)和O(ElogE),其中V为顶点数,E为边数。在实际应用中,选取合适的算法取决于图的规模和边的数量等因素。

【高阶数据结构】图 {最小生成树:Kruskal算法,Prim算法;最短路径:Dijkstra算法,Bellman-Ford算法,Floyd算法}-CSDN博客

4.4 最短路径算法

最短路径算法主要有Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法三种。

首先初始化两个数组,一个用来存储源点和任意顶点之间的最短路径的父节点,一个用来存储最短路径的长度。

  1. Dijkstra算法(单源):
    • 从起始顶点开始,将其加入已访问的顶点集合,并初始化起始顶点到其他顶点的距离。
    • 选择与起始顶点直接相连的顶点中距离最短的顶点,将其加入已访问的顶点集合。
    • 更新起始顶点到其他顶点的距离,若经过当前已访问的顶点到其他顶点的距离比原先的距离短,则更新距离。
    • 重复以上步骤,直到所有顶点都已加入已访问的顶点集合。
  2. Bellman-Ford算法(单源):
    • 初始化距离数组,将起始顶点的距离设置为0,其余顶点的距离设置为无穷大。
    • 通过对所有边进行|V|-1次松弛操作,其中|V|为顶点的数量。
    • 检查每条边的两个顶点,如果经过当前边可以获得更短的路径,则更新路径长度。
    • 最后再次遍历所有边,检查是否存在负权回路。
  3. Floyd-Warshall算法(多源):
    • 初始化两个二维数组,一个用来存储任意两个顶点之间的最短路径的父节点,一个用来存储最短路径的长度。
    • 通过三重循环,逐步尝试将中间顶点纳入考虑,即假设中间顶点k是当前考虑的点,则对于任意两个顶点i和j,如果通过顶点k可以使得从i到j的路径长度变短,则更新dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    • 重复以上操作直到所有顶点都被考虑为中间节点为止。最终得到一个二维数组,其中存储了任意两个顶点之间的最短路径距离。

Dijkstra算法和Bellman-Ford算法适用于单源最短路径问题,它们的时间复杂度分别为O(V^2)和O(V*E),其中V为顶点数,E为边数,Bellman-Ford算法的性能较Dijkstra算法略差,但是它可以处理带有负权边的图,并且能够检测负权回路。Floyd-Warshall算法适用于多源最短路径问题,它的时间复杂度为O(V^3),其中V为顶点数。选择合适的算法取决于具体的问题需求和图的规模等因素。

【高阶数据结构】图 {最小生成树:Kruskal算法,Prim算法;最短路径:Dijkstra算法,Bellman-Ford算法,Floyd算法}-CSDN博客

4.5 有向无环图的应用

有向无环图的应用—描述表达式、AOV网、拓扑排序、AOE网、关键路径-CSDN博客

图-拓扑排序_哔哩哔哩_bilibili

图-AOE网和关键路径_哔哩哔哩_bilibili

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
怎么求关键路径?先求点,再求边

在这里插入图片描述
源点和汇点的ve, vl相等,工程的开始和结束不能拖延

求ve:先将所有事件的ve初始化为源点的ve(0),按照拓扑序从源点求到汇点,其他事件的ve取所有路径活动最早开始时间的最大值(所用时间的最大值),因为要保证所有的活动都完成事件才能发生。

在这里插入图片描述
求vl:先将所有事件的vl初始化为汇点的vl(ve),按照逆拓扑序从汇点求到源点,其他事件的vl取所有路径活动最晚开始时间的最小值(结束时间-所用时间的最大值),因为要保证所有路径活动都有足够的时间完成。

在这里插入图片描述
求e:活动的最早开始时间就是开始事件的最早开始时间。

求l:活动的最晚开始时间就是结束事件的最晚开始时间-活动所用时间。

关键活动:e和l相等的活动

关键路径:由关键活动连接而成的路径,耗时最长的路径。关键路径可能不是唯一的。

时间余量:每个活动的最晚开始时间l - 最早开始时间e = 时间余量;表示该活动可以拖延的时间。关键活动的时间余量是0,是不能拖延的活动。


五、其他

5.1 跳表

在这里插入图片描述

  1. 定义和特性:跳表是一种有序的数据结构,是一种空间换时间的设计思想。跳表通过添加多层索引来加速查询操作,使得查询的时间复杂度接近于O(log n)。在一层索引中,每个节点都具有指向同层下一个节点的指针。跳表可以用于替代有序链表和平衡二叉树,它在某些情况下比平衡二叉树的查询操作更快。

  2. 实现方式:跳表由一个有序链表组成,同时使用多层索引来加速查询操作。每一层索引都是原始链表的一个子集,且节点之间的链接关系保持有序。通过增加层数,跳表的查询效率逐渐提高。

  3. 操作与复杂度:跳表支持的基本操作包括插入、删除和查询。在跳表中插入和删除一个元素的时间复杂度为O(log n),其中n为跳表中的元素个数。查询操作的时间复杂度也为O(log n)。

  4. 适用场景:跳表适用于需要高效的查询操作,并且对添加和删除操作的效率要求相对较低的场景。跳表在Redis等内存数据库中经常被使用来提高查询效率。

  5. 相关算法:跳表涉及的算法主要是层级索引的建立和维护。常见的一种算法是跳表的插入算法,它通过随机生成层数来建立索引,使得查询操作的效率更高。

  6. 应用实例:跳表在实际工程中有多种应用。例如,在区块链技术中,跳表可以用于实现快速的交易确认;在网络中,跳表可以用于路由表的构建和维护。

【高阶数据结构】跳表 {什么是跳表-skiplist;skiplist的效率如何保证;skiplist的实现;skiplist跟平衡搜索树和哈希表的对比}-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React Native 之 原生组件和核心组件(二)

原生组件 在 Android 开发中是使用 Kotlin 或 Java 来编写视图;在 iOS 开发中是使用 Swift 或 Objective-C 来编写视图。在 React Native 中,则使用 React 组件通过 JavaScript 来调用这些视图。在运行时,React Native 为这些组件创建相应的 …

第1章 初始Spring Boot【仿牛客网社区论坛项目】

第1章 初始Spring Boot【仿牛客网社区论坛项目】 前言推荐项目总结第1章初识Spring Boot,开发社区首页1.课程介绍2.搭建开发环境3.Spring入门体验IOC容器体验Bean的生命周期体验配置类体验依赖注入体验三层架构 4.SpringMVC入门配置体验响应数据体验响应Get请求体验…

Java应用程序的本地内存跟踪分析

本文将讨论本机内存跟踪 (NMT),我们可以使用它来隔离在 VM 级别增长的任何异常内存。 1.什么是本机内存? 本机内存是指计算机系统上运行的应用程序或程序可直接访问的内存空间。它是程序在执行期间存储和操作数据的内存区域。本机内存不同于托管内存&a…

实物仿真平台设计方案:927-8路GMSL视频注入回灌的自动驾驶半实物仿真平台

8路GMSL视频注入回灌的自动驾驶半实物仿真平台 一、平台介绍 产品基于8路GMSL视频注入回灌的自动驾驶半实物仿真平台旨在提高实验室及研究生院师生在基础软件层开发、计算机视觉和深度学习方面的专业知识学习和实践能力,为师生提供一个稳定软件开发和多精度框…

【C++】认识C++(上)

目录 从C到C命名空间同名冲突命名空间的定义命名空间的使用 C的输入和输出缺省参数(默认参数) 从C到C C语言的出现是计算机科学和工程史上的一个重要里程碑,许多现代计算机语言都受C语言的影响。C语言是面向过程的,结构化和模块化…

优选算法——双指针2

题目一——有效三角形的个数 思路 先审题 举个例子,下面一个序列可分成4个三元组 然后我们论证哪个可以组成三角形即可 判断三个数能不能组成三角形:任意两边之和大于第三边 注意第一个和第四个,有人说,这不是两个相同的吗&#…

【opencv】opencv透视变换和ocr识别实验

实验环境:anaconda、jupyter notebook 实验用到的包opencv、numpy、matplotlib、tesseract 一、opencv透视变换 原图 图片是我拍的耳机说明书,哈哈哈哈,你也可以使用自己拍的照片,最好是英文内容,tesseract默认识别英…

JVM运行时内存整体结构一览

文章目录 Java 虚拟机 (JVM) 运行时内存由程序计时器, 堆, 方法区, 本地方法栈, 虚拟机栈,构成 Java 虚拟机 (JVM) 运行时内存布局主要包括以下几个部分: 程序计数器 (Program Counter Register): 每个线程都有一个程序计数器,它是当前线程执行的字节码…

【js逆向】易车网JS逆向案例实战手把手教学(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

删除表空间

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 当某个表空间中的数据不再需要时,或者新创建的表空间不符合要求时,可以考虑删除这个表空间。若要删除表空间,则需要用户具有 DROP TABLESP…

OpenNJet产品体验:探索无限可能

文章目录 前言一、OpenNJet是什么?二、OpenNJet特性和优点三、OpenNJet功能规划四、OpenNJet快速上手五、OpenNJet的使用总结 前言 现代社会网络高速发展,同时也迎来了互联网发展的高峰,OpenNJet作为一个基于NGINX的面向互联网和云原生应用提…

【C语言每日题解】三题:回文检查、刘备 关羽 张飞三人过年放鞭炮、犹太人死亡游戏(难度up,推荐⭐✨)

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 🌈感谢大家的阅读、点赞、收藏和关注 🥰希望大家喜欢我本次的讲解 🌟非常推荐最后一道题 🌹 犹太人死亡游戏,建议观看 &…

20240514,算法(算数生成,集合)

还有一个大案例&#xff0c;那个就不急了&#xff0c;完结撒花&#xff0c;起码C是打代码没什么大问题的完结&#xff0c;不像C&#xff0c;还要我返工/笑哭 常用算数生成算法 属于小算法&#xff0c;头文件 #include <numeric> accumulate //计算容器累计总和fill /…

考研数学|李林《880》PK李永乐《660》,你用对了吗?

建议先在强化之前做660&#xff0c;然后在强化的时候再做880。 660整体难度属于基础阶段到强化阶段。而且是选填部分的题目&#xff0c;所以还是要做一些其他题 然后说一下推荐的习题册&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。但是传统习题…

FPGA - Xilinx系列高速收发器---GTX

1&#xff0c;GTX是什么&#xff1f; GT &#xff1a;Gigabit Transceiver千兆比特收发器&#xff1b; GTX &#xff1a;Xilinx 7系列FPGA的高速串行收发器&#xff0c;硬核 xilinx的7系列FPGA根据不同的器件类型&#xff0c;集成了GTP、GTX、GTH、GTZ四种串行高速收发器&am…

Ansible自动化运维中的User用户管理模块应用详解

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月14日14点12分 在Ansible中&#xff0c;user 模块主要用于管理系统用户账户。它可以创建、修改、删除用户&#xff0c;并管理用户的属性&#xff0c;比如密码、…

深⼊理解指针(5)

目录 1. 回调函数是什么&#xff1f;1.1 使用回调函数修改 2. qsort使⽤举例2.1 使⽤qsort函数排序整型数2.2 使⽤qsort排序结构数据按年龄排序2.3 使⽤qsort排序结构数据按名字排序2.4整体代码 3. qsort函数的模拟实现3.1 整型数组的实现3.2 结构体按名字排序实现3.3 结构体按…

Element Plus组件库使用组件自动导入后样式不生效的问题

首先按照官方文档上的介绍进行配置&#xff1a;快速开始 | Element Plus (element-plus.org) 配置完成后&#xff0c;去组件中去测试组件库中的button组件的样式是否生效 <template><el-button type"primary">Primary</el-button> </template&…

从源头到洞察:大数据时代的数据提取与分析实战指南

随着科技的飞速发展&#xff0c;大数据已经成为现代社会的核心驱动力之一。从商业决策到科学研究&#xff0c;从政策制定到个人生活&#xff0c;数据无处不在&#xff0c;影响着我们的每一个决策。然而&#xff0c;如何从海量的数据中提取有价值的信息&#xff0c;并转化为深刻…

一对一WebRTC视频通话系列(六)——部署到公网

本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习&#xff0c;梳理总结后写下文章&#xff0c;对音视频相关内容感…