📝 算法教程的设计与分析
41篇技术文档📅  最后修改于: 2021-01-12 03:34:29        🧑  作者: Mango
动态编程也用于优化问题。像分治法一样,动态规划通过组合子问题的解决方案来解决问题。此外,动态编程算法只解决一次每个子问题,然后将其答案保存在表格中,从而避免了每次重新计算答案的工作。问题的两个主要属性表明,可以使用动态编程来解决给定的问题。这些属性是重叠的子问题和最优子结构。重叠子问题与分而治之的方法类似,动态编程也将解决方案结合到子问题中。它主要用于需要反复解决一个子问题的场合。计算出的解存储在...
📅  最后修改于: 2021-01-12 03:34:56        🧑  作者: Mango
在本教程中,我们前面已经讨论了使用贪婪方法的分数阶背包问题。我们已经表明,贪婪方法为小背包带来了最佳解决方案。但是,本章将介绍0-1背包问题及其分析。在0-1背包中,物品不能被破坏,这意味着小偷应该将物品作为一个整体或应该离开它。这就是将其称为0-1背包的原因。因此,在0-1背包的情况下,xi的值可以为0或1,而其他约束保持不变。0-1背包无法通过贪婪方法解决。贪婪的方法不能确保最佳解决方案。在许...
📅  最后修改于: 2021-01-12 03:35:20        🧑  作者: Mango
最长的公共子序列问题是找到两个给定字符串中都存在的最长序列。子序列让我们考虑序列S = <s1,s2,s3,s4,…,sn>。S上的序列Z = <z1,z2,z3,z4,…,zm>称为S的子序列,当且仅当它可以从某些元素的S缺失中得出。共同子序列假设X和Y是元素的有限集合上的两个序列。我们可以说,Z是X和Y的一个公共子序列,如果Z,X和Y的子序列。最长的公共子序列如果给出一组序列,则最长的公共子序...
📅  最后修改于: 2021-01-12 03:35:42        🧑  作者: Mango
生成树是无向图的子集,该图的所有顶点都通过最小数量的边连接。如果所有顶点都连接在一个图中,则至少存在一棵生成树。在一个图中,可能存在一个以上的生成树。物产生成树没有任何循环。可以从任何其他顶点到达任何顶点。例在下图中,突出显示的边缘形成一棵生成树。最小生成树最小生成树(MST)是连接的加权无向图的边的子集,该边将所有顶点与最小可能的总边权重连接在一起。要导出MST,可以使用Prim算法或Krusk...
📅  最后修改于: 2021-01-12 03:36:12        🧑  作者: Mango
Dijkstra的算法Dijkstra的算法解决了有向加权图G =(V,E)上的单源最短路径问题,其中所有边均为非负值(即,每个边的w(u,v)≥0(u,v )ЄE)。在以下算法中,我们将使用一个函数Extract-Min(),该函数提取具有最小密钥的节点。分析该算法的复杂性完全取决于Extract-Min函数。如果使用线性搜索实现提取最小函数,则该算法的复杂度为O(V2+ E)。在此算法中,如果...
📅  最后修改于: 2021-01-12 03:36:31        🧑  作者: Mango
多级图G =(V,E)是一个有向图,其中顶点被划分为k(其中k> 1)个不相交的子集S = {s1,s2,…,sk},使得边(u, v)在E中,则该分区中的某些子集的ui和v s1 +1。s1| = |k= 1。顶点s s1称为源,顶点t sk称为宿。通常将G假定为加权图。在该图中,边缘(i,j)的成本由c(i,j)表示。因此,从源s到汇点t的路径成本是该路径中每个边的成本之和。多级图问题是找到从...
📅  最后修改于: 2021-01-12 03:37:06        🧑  作者: Mango
问题陈述旅行者需要从一个列表中访问所有城市,在该列表中,所有城市之间的距离是已知的,每个城市应仅被访问一次。他一次访问每个城市并返回原城市的最短路线是什么?解旅行商问题是最臭名昭著的计算问题。我们可以使用蛮力方法来评估每个可能的游览,然后选择最佳游览。对于图中n个顶点,有(n-1)个!数量的可能性。尽管没有多项式时间算法,但可以使用更少的时间来获得解决方案,而不是使用动态编程方法进行暴力破解。让我...
📅  最后修改于: 2021-01-12 03:37:35        🧑  作者: Mango
二进制搜索树(BST)是其中键值存储在内部节点中的树。外部节点为空节点。键按字典顺序排序,即,对于每个内部节点,左子树中的所有键都小于节点中的键,而右子树中的所有键都较大。当我们知道搜索每个键的频率时,很容易计算访问树中每个节点的预期成本。最佳的二叉搜索树是BST,它具有最小的定位每个节点的预期成本BST中元素的搜索时间为O(n),而Balanced-BST中元素的搜索时间为O(log n)。同样...
📅  最后修改于: 2021-01-12 03:37:57        🧑  作者: Mango
堆有几种类型,但是在本章中,我们将讨论二进制堆。二进制堆是一种数据结构,看起来类似于完整的二进制树。堆数据结构遵循下面讨论的排序属性。通常,堆由数组表示。在本章中,我们用H表示堆。由于堆的元素存储在数组中,因此将起始索引视为1,则可以在elementi / 2处找到第i个元素的父节点的位置。第i个节点的左子节点和右子节点位于2i和2i +1位置。根据排序属性,二进制堆可以进一步分为最大堆或最小堆。...
📅  最后修改于: 2021-01-12 03:38:15        🧑  作者: Mango
要在堆中插入一个元素,新元素最初会作为数组的最后一个元素附加到堆的末尾。插入此元素之后,可能会违反堆属性,因此可以通过将添加的元素与其父元素进行比较,并将添加的元素上移一个级别,与父元素交换位置来修复堆属性。这个过程称为渗滤上升。重复比较直到父对象大于或等于渗滤元素。分析最初,在数组的末尾添加了一个元素。如果违反了heap属性,则将元素与其父元素交换。树的高度为log n。需要执行的最大登录次数。...
📅  最后修改于: 2021-01-12 03:38:28        🧑  作者: Mango
Heapify方法重新排列数组的元素,第i个元素的左和右子树遵循heap属性。当提供的数组不遵循heap属性时,将基于以下算法Build-Max-Heap(numbers [])构建Heap。...
📅  最后修改于: 2021-01-12 03:38:42        🧑  作者: Mango
提取方法用于提取堆的根元素。以下是算法。例让我们考虑前面讨论的相同示例。现在我们要提取一个元素。此方法将返回堆的根元素。删除根元素后,最后一个元素将移至根位置。现在,将调用Heapify函数。 Heapify之后,将生成以下堆。...
📅  最后修改于: 2021-01-12 03:39:08        🧑  作者: Mango
冒泡排序是一种基本排序算法,必要时可通过重复交换相邻元素来工作。如果不需要交换,则对文件进行排序。这是所有排序算法中最简单的技术。实作分析在这里,比较次数是1 + 2 + 3 + … +(n-1)=n(n-1)/ 2 = O(n2)显然,该图显示了气泡排序的n2性质。在该算法中,比较次数与数据集无关,即所提供的输入元素是按排序顺序还是反向顺序还是随机的。记忆需求根据上述算法,很明显气泡排序不需要额...
📅  最后修改于: 2021-01-12 03:39:30        🧑  作者: Mango
插入排序是一种非常简单的方法,可以对数字进行升序或降序排序。该方法遵循增量方法。可以将其与在玩游戏时如何对牌进行排序的技术进行比较。需要排序的数字称为键。这是插入排序方法的算法。分析该算法的运行时间在很大程度上取决于给定的输入。如果给定的数字已排序,则此算法将在O(n)时间内运行。如果给定数字是相反的顺序,则该算法将在O(n2)时间内运行。例Unsorted list:21351814第一次迭代:...
📅  最后修改于: 2021-01-12 03:39:59        🧑  作者: Mango
这种类型的排序称为选择排序,因为它通过对元素进行重复排序而起作用。它的工作方式如下:首先在数组中找到最小的元素,然后与位于第一个位置的元素交换,然后找到第二个最小的元素,并将其与位于第二个位置的元素交换,然后以这种方式继续操作,直到整个数组成为排序。选择排序是最简单的排序技术之一,对于小型文件非常有用。它具有非常重要的应用程序,因为每个项目实际上最多只能移动一次。节排序是一种用于对具有非常大的对象...