前言:
当前朋友们对“prim算法流程图”大概比较讲究,朋友们都想要学习一些“prim算法流程图”的相关文章。那么小编同时在网络上搜集了一些对于“prim算法流程图””的相关知识,希望姐妹们能喜欢,看官们一起来了解一下吧!#算法与数据结构#
#程序员面试#
#架构师#
#打工人#
#打工人的快乐你不懂#
头条不允许放外链, 关注我私信 [资料], 送你整理好的 100 本 pdf资料, 如图1 数组
数组是最简单,最常见的数据结构。它们的特点是可以通过索引(位置)方便地访问元素。
使用场景
想象一下有排剧院椅。每把椅子都分配了一个位置(从左到右),因此每个观众都会从他要坐的椅子上分配一个号码。这是一个数组。将问题扩展到整个剧院(椅子的行和列),您将拥有一个2D阵列(矩阵)!
特性元素的值按顺序放置,并通过其索引从0到array-1的长度进行访问;数组是连续的内存块;它们通常由相同类型的元素组成(取决于编程语言);元素的访问和添加速度很快;搜索和删除未在O(1)中完成。Leetcode相关题目
GeeksforGeeks:数组简介LeetCode问题集阵列上的前40个问题2.链表
链接列表是线性数据结构,就像数组一样。链接列表和数组之间的主要区别在于,链接列表的元素不存储在连续的内存位置。它由节点组成-实体存储当前元素的值和对下一个元素的地址引用。这样,元素通过指针链接。
使用场景
链接列表的一个相关应用是浏览器上一页和下一页的实现。双向链接列表是存储用户搜索显示的页面的理想数据结构。
特性它们分为三种类型:单,双和圆形。元素不存储在连续的内存块中;非常适合出色的内存管理(使用指针意味着动态内存使用);插入和删除速度很快;访问和搜索元素是在线性时间内完成的。Leetcode相关题目可视化链接列表InterviewBit:链接列表3.堆栈
堆栈是一种抽象的数据类型,它使受限制的访问集合的概念形式化。该限制遵循规则LIFO(后进先出)。因此,添加到堆栈中的最后一个元素是您从堆栈中删除的第一个元素。
可以使用数组或链接列表来实现堆栈。
使用场景
现实生活中最常见的示例是在食堂中将一个盘子放在另一个盘子上。顶部的板是第一个要卸下的板。位于最底部的板是在堆栈中保留时间最长的板。
堆栈最有用的一种情况是需要获取给定元素的相反顺序。只需将它们全部推入堆栈,然后弹出它们即可。
另一个有趣的应用是有效括号问题。给定一串括号,您可以使用堆栈检查它们是否匹配。
特性您一次只能访问最后一个元素(顶部的那个);一个缺点是,一旦从顶部弹出元素以访问其他元素,它们的值就会从堆栈的内存中丢失;其他元素的访问是在线性时间内完成的;其他任何操作都在O(1)中。Leetcode相关题目CS学院:堆栈介绍CS学院:堆栈应用程序-士兵行LeetCode问题集4.队列
队列是受限访问集合中的另一种数据类型,就像前面讨论的堆栈一样。主要区别在于队列是按照FIFO(先进先出)模型组织的:队列中插入的第一个元素是要删除的第一个元素。可以使用固定长度的数组,循环数组或链表来实现队列。
使用场景
当然,此抽象数据类型(ADT)的最佳用途是模拟真实队列。例如,在呼叫中心应用程序中,队列用于保存等待从顾问那里获得帮助的客户端-这些客户端应按其呼叫顺序获得帮助。
优先队列是一种特殊且非常重要的队列。根据与元素相关联的“优先级”将元素引入队列:具有最高优先级的元素是队列中的第一个引入。此ADT在许多图算法(Dijkstra算法,BFS,Prim算法,霍夫曼编码-在下面详细介绍)中都是必不可少的。它是使用堆实现的。
队列的另一种特殊类型是双端队列(pun alert它的发音为“ deck”)。可以从队列的两端插入/删除元素。
特性我们只能直接访问引入的“最旧”元素;搜索元素将从队列的内存中删除所有访问的元素;弹出/推入元素或获得队列的前面是在固定时间内完成的。搜索是线性的。Leetcode相关题目可视化队列LeetCode问题集5.地图和哈希表
映射(字典)是抽象数据类型,包含键的集合和值的集合。每个键都有一个与之关联的值。
哈希表是地图的一种特殊类型。它使用哈希函数将哈希码生成到存储桶或插槽的数组中:对键进行哈希处理,并且产生的哈希值指示将值存储在何处。
最常见的哈希函数(其中很多)是模常数函数。例如,如果常量为6,则键x的值为x%6。
理想情况下,哈希函数会将每个键分配给唯一的存储桶,但是大多数设计采用了不完善的功能,该功能可能会导致具有相同生成值的键之间发生冲突。这样的碰撞总是以某种方式解决。
使用场景
地图最著名的应用是语言词典。语言中的每个单词都为其指定了定义。它是使用有序映射实现的(其键是按字母顺序排序的)。
通讯录也是地图。每个名称都有一个分配给它的电话号码。
另一个有用的应用是值的标准化。假设我们要为一天中的每一分钟(24小时= 1440分钟)分配一个从0到1439的索引。哈希函数将为h(x)= x.hour * 60 + x.minute。
特性密钥是唯一的(没有重复);耐碰撞性:很难用相同的键找到两个不同的输入;成像前电阻:给定值H,应该很难找到键x,使得h(x)= H;第二次成像前电阻:给定一个键及其值,应该很难找到另一个具有相同值的键;术语:*“地图”:Java,C ++;*“字典”:Python,JavaScript,.NET;*“关联数组”:PHP。因为地图是使用自平衡的红黑树实现的(如下所述),所以所有操作都在O(log n)中完成;所有哈希表操作都是常量。Leetcode相关题目Codeforce问题集6.图
图是表示两个两组对的非线性数据结构:G = {V,E},其中V是一组顶点(节点),E是一组边缘(箭头)。节点是由边互连的值-描绘两个节点之间的依赖关系(有时与成本/距离相关)的线。
图有两种主要类型:有向图和无向图。在无向图中,边(x,y)在两个方向上都可用:(x,y)和(y,x)。在有向图中,边(x,y)称为箭头,方向由其名称中的顶点顺序确定:arrow (x,y)与arrow (y,x)不同。
使用场景
图形是每种类型的网络的基础:社交网络(如Facebook,LinkedIn),甚至是城市的街道网络。社交媒体平台的每个用户都是一个包含其所有个人数据的结构-它代表网络的一个节点。Facebook上的友谊是无向图中的边缘(因为它是对等的),而在Instagram或Twitter上,帐户与其追随者/跟随帐户之间的关系是有向图中的箭头(不是对等的)。
特性
图论是一个广阔的领域,但我们将重点介绍一些最著名的概念:
无向图中节点的度数是其入射边的数量;有向图中节点的内部/外部程度是指向该节点的箭头数量。从节点x到节点y的链是相邻边的接替,其中x为左端,y为右端。一个循环是x = y的链;图可以是循环/非循环的;如果来自V的任意两个节点之间存在链,则图是连通的;可以使用广度优先搜索(BFS)或深度优先搜索(DFS)遍历和处理图形,两者均以O(| V | + | E |)完成,其中| S | 是集合S的基数;查看以下链接,了解图论中的其他基本信息。Leetcode相关题目图形编辑器维基百科:图形-离散数学CS学院:图形表示LeetCode问题集7.树木
一棵树是无向图,在连通性方面最小(如果我们消除单个边,该图将不再连接),在非循环性方面最大(如果我们添加一个边,该图将不再是无环) 。因此,任何非循环连接的无向图都是一棵树,但为简单起见,我们将根树称为树。
根是一个固定的节点,它确定树中边缘的方向,因此这就是一切“开始”的地方。叶子是树的末端节点-这就是一切“结束”的地方。
顶点的子级是其下方的入射顶点。一个顶点可以有多个子代。顶点的父级是其上方的入射顶点-它是唯一的。
使用场景
我们随时随地都应该使用树来描述层次结构。我们自己的家谱树就是一个很好的例子。您最老的祖先是树的根。最年轻的一代代表叶子的集合。
树还可以代表您所在公司的下属关系。这样,您就可以找出谁是您的经理以及应该管理谁。
特性根没有父母;叶子没有孩子。根与节点x之间的链长表示x所在的级别;一棵树的高度是它的最大高度(在我们的示例中为3);遍历树的最常见方法是O(| V | + | E |)中的DFS,但我们也可以使用BFS。使用DFS在任何图中遍历的节点的顺序形成了DFS树,该树指示了我们访问节点的时间。Leetcode相关题目教程重点:树Codeforce问题集8.二叉树和二叉搜索树
二叉树是一种特殊的树:每个顶点最多可以有两个子树。在严格的二叉树中,每个节点除叶子外都恰好有两个子代。具有n个层的完整二叉树具有所有2ⁿ-1个可能的节点。
二进制搜索树是一种二进制树,其中节点的值属于一个完全有序的集合-任何选择的节点的值都大于左侧子树中的所有值,小于右侧子树中的所有值。
使用场景
BT的一项重要应用是逻辑表达式的表示和评估。每个表达式都可以分解为变量/常量和运算符。这种表达编写方法称为反向波兰表示法(RPN)。这样,它们就可以形成一个二叉树,其中内部节点是运算符,而叶是变量/常量-它被称为抽象语法树(AST)。
BST由于快速搜索keys属性而被频繁使用。AVL树,红黑树,有序集和映射是使用BST实现的。
特性BT的DFS遍历有三种类型:*预购(根,左,右);*顺序(左,根,右);*后置顺序(左,右,根);全部在O(n)时间内完成;顺序遍历给我们树中所有节点的升序排列;最左边的节点是BST中的最小值,最右边的节点是最大值。注意RPN是AST的有序遍历;BST具有排序数组的优点,但对数插入的缺点-它的所有操作都在O(log n)时间完成。Leetcode相关题目GeeksforGeeks:二叉树GeeksforGeeks:表达树的评估媒介:最佳BST练习问题和面试问题9.自平衡树
所有这些类型的树都是自平衡二进制搜索树。区别在于他们在对数时间中平衡身高的方式。
每次插入/删除后,AVL树都是自平衡的,因为节点的左子树和右子树的高度之间的模块差最大为1。AVL以其发明者Adelson-Velsky和Landis命名。
在“红黑树”中,每个节点都存储一个代表颜色的额外位,用于确保每次插入/删除操作后的平衡。
在Splay树中,可以再次快速访问最近访问的节点,因此任何操作的摊销时间复杂度仍为O(log n)。
使用场景
在数据库理论中,AVL似乎是最好的数据结构。
RBT用于组织可比较的数据,例如文本片段或数字。在Java版本8中,HashMap是使用RBT实现的。计算几何和功能编程中的数据结构也使用RBT构建。
Splay树用于Windows NT(在虚拟内存,网络和文件系统代码中)中的缓存,内存分配器,垃圾收集器,数据压缩,绳索(用于替换长文本字符串的字符串)。
特性在任何自平衡BST中,任何操作的摊销时间复杂度为O(log n);在最坏的情况下,AVL的最大高度为1.44 * log2n(为什么?*提示:考虑所有级别都已满的AVL的情况,除了最后一个仅包含单个元素的级别);AVL实际上是搜索元素最快的方法,但是为了自平衡而旋转子树的成本很高;同时,由于没有轮换,彩铃提供了更快的插入和删除;八卦树不需要存储任何簿记数据。Leetcode相关题目GeeksforGeeks:AVL树GeeksforGeeks:红黑树GeeksforGeeks:八卦树10,堆
最小堆是二叉树,其中每个节点具有其值大于或等于其父节点的值的属性:val [par [x]] <= val [x],堆的xa节点为,其中val [ x]是其值,par [x]是其父级。
还有一个实现相反关系的最大堆。
二进制堆是完整的二进制树(除最后一个级别外,所有级别都已填充)。
使用场景
正如我们几天前讨论的那样,可以使用二进制堆有效地实现优先级队列,因为它在O(log n)时间内支持insert(),delete(),extractMax()和reduceKey()操作。这样,堆在图算法中也是必不可少的(由于优先级队列)。
每当您需要快速访问最大/最小项目时,堆都是最佳选择。
堆也是堆排序算法的基础。
特性它总是平衡的:每当我们在结构中删除/插入一个元素时,我们只需对其进行“筛选” /“渗滤”,直到它处于正确的位置;节点k> 1的父节点为[k / 2](其中[x]是x的整数部分),其子节点为2 * k和2 * k + 1;设置优先级队列的替代方法,ordered_map(在C ++中)或任何其他可以轻松允许访问最小/最大元素的有序结构;根是优先级,因此其访问的时间复杂度为O(1),插入/删除操作在O(log n)中完成;创建堆是在O(n)中完成的;O(n * log n)中的heapsort。Leetcode相关题目GeeksforGeeks:堆11.尝试
特里树是一种有效的信息检索数据结构。也称为前缀树,它是一种搜索树,它允许以O(L)时间复杂度进行插入和搜索,其中L是密钥的长度。
如果我们将密钥存储在平衡良好的BST中,则将需要与L * log n成比例的时间,其中n是树中密钥的数量。这样,特里树是一种比BST更快的数据结构(具有O(L))的方法,但代价是特里树的存储要求。
使用场景
特里树通常用于存储字符串及其值。它最酷的应用程序之一是在Google搜索栏中键入自动完成和自动建议。特里树是最好的选择,因为它是最快的选择:如果我们不使用特里树,更快的搜索比保存的存储更有价值。
通过在字典中查找单词或在同一文本中查找单词的其他实例,还可以使用trie来完成键入单词的词法自动更正。
特性它具有键值关联;键通常是一个单词或它的前缀,但它可以是任何有序列表;根有一个空字符串作为键;节点值与其子值之间的长度差为1;这样,根的子代将存储长度为1的值;作为结论,我们可以说,级别k的节点x的长度为k;如前所述,插入/搜索操作的时间复杂度为O(L),其中L是键的长度,比BST的O(log n)快得多,但与哈希表相当;空间复杂度实际上是一个缺点:O(ALPHABET_SIZE * L * n)。Leetcode相关题目中:尝试了解尝试GeeksforGeeks:尝试12.段树
段树是一个完整的二叉树,可以有效地回答查询,同时仍然可以轻松地修改其元素。
给定数组中索引i上的每个元素都代表一个用[i,i]间隔标记的叶子。节点的子节点分别标记为[x,y]和[y,z]的节点将以[x,z]间隔作为标签。因此,给定n个元素(索引为0),段树的根将被标记为[0,n-1]。
使用场景
它们在可以使用Divide&Conquer(我们将要讨论的第一个算法概念)解决的任务中非常有用,并且可能还需要更新其元素。这样,在更新元素时,包含元素的任何间隔也会被修改,因此复杂度是对数的。例如,n个给定元素的和/最大/最小是段树的最常见应用。如果正在发生元素更新,则二进制搜索也可以使用段树。
特性作为二叉树,节点x将具有2 * x和2 * x + 1作为子节点,[x / 2]作为父节点,其中[x]是x的整数部分;更新分段树中整个范围的一种有效方法称为“延迟传播”,也可以在O(log n)中完成(有关操作的实现,请参见下面的链接);它们可以是k维的:例如,有q个查询来查找一个矩阵的给定子矩阵的和,我们可以使用二维分段树;更新元素/范围需要O(log n)时间;对查询的回答是常量(O(1));空间复杂度是线性的,这是BIG的一大优势:O(4 * n)。Leetcode相关题目CP算法:段树。延迟传播GeeksforGeeks:细分树Codeforce问题集13.芬威克树
fenwick树,也称为二进制索引树(BIT),是一种数据结构,也用于高效的更新和查询。与段树相比,BIT所需的空间更少,并且更易于实现。
使用场景
BIT用于计算前缀和-第i个位置的元素的前缀和是从第一个位置到第i个元素的和。它们使用数组表示,每个索引在二进制系统中表示。例如,索引10等于十进制系统中的索引2。
特性树的构造是最有趣的部分:首先,数组应为1索引。要找到节点x的父节点,应将其索引x转换为二进制系统并翻转最右边的有效位;例如 节点6的父节点为4;6 = 1 *2²+ 1 *2¹+ 0 *2⁰=> 1“ 1” 0(翻转)=> 100 = 1 *2²+ 0 *2¹+ 0 *2⁰= 4;最后,对于ANDing元素,每个节点都应包含一个可以添加到前缀和中的间隔(有关以下链接中的构造和实现的更多信息);更新的时间复杂度和查询的O(1)的时间复杂度仍为O(log n),但与段树的O(4 * n)相比,空间复杂度甚至是更大的优势:O(n)。Leetcode相关题目Tushar Roy:BIT极客:BITCP算法:BIT14.不交集联合
我们给了n个元素,每个元素代表一个单独的集合。不交集联合(DSU)允许我们执行两项操作:
UNION —合并任意两个集合(或者如果两个不同元素的集合不同,则将它们统一);查找—查找元素来自的集合。使用场景
DSU在图论中非常重要。您可以检查两个顶点是否来自相同的连接组件,甚至可以统一两个连接的组件。
让我们以城镇为例。由于具有人口和经济增长的邻近城市正在扩大,因此它们可以轻松创建大都市。因此,两个城市合并在一起,其居民居住在同一个大都市中。我们还可以通过调用FIND函数来检查一个人居住的城市。
特性它们用树表示;一旦将两个集合组合在一起,两个根之一便成为主根,另一个根的父代成为另一棵树的叶子之一;一种实用的优化方法是按树的高度对其进行压缩。这样,联合是由最大的树构成的,可以轻松地更新它们的两个数据(请参见下面的实现);所有操作都在O(1)时间内完成。Leetcode相关题目GeeksforGeeks:DSUCP算法:DSUCodeforce问题集15.最小生成树
给定一个连接和无向图,该图的生成树是一个子图,它是一棵树,将所有节点连接在一起。单个图可以具有许多不同的生成树。加权,连通和无向图的最小生成树(MST)是权重(成本)小于或等于其他所有生成树的权重的生成树。生成树的权重是赋予生成树的每个边缘的权重之和。
使用场景
MST问题是优化问题,是最小成本问题。有了路线网络,我们可以认为影响n个城市之间国家路线建立的因素之一是两个相邻城市之间的最小距离。
这样,国道由道路网络图的MST表示。
特性作为树,具有n个顶点的图的MST具有n-1个边;可以使用以下方法解决:* Prim算法-密集图(具有n个节点且边数接近n(n-1)/ 2的图)的最佳选择;* Kruskal算法-多数使用;这是一个基于不相交集合并集的贪婪算法(我们还将对此进行讨论);对于Kruskal(取决于图形),构建它的时间复杂度为O(n log n)或O(n log m),对于Prim,则为O(n²)。
标签: #prim算法流程图