Algorithm 如何使我的应用程序能够很好地扩展?

一般来说,什么样的设计决策有助于应用程序更好地扩展 (注意:刚刚了解了,我希望在这里收集更多的编程原则。我试图通过回答下面我自己的问题来解释大O符号,但我希望社区改进这个问题和答案。) 到目前为止的回应 1) 定义缩放。您是否需要为虚拟环境中的大量用户、流量和对象进行扩展? 2) 看看你的算法。他们所做的工作量是否会与实际工作量成线性比例-即循环的项目数、用户数等? 3) 看看你的硬件。您的应用程序设计是否可以在一台机器无法跟上的情况下在多台机器上运行 次要想法 1) 不要太快优化太多-先测试。

Algorithm 比较单词的算法(非字母顺序)

我需要为某个特定需求编写一个解决方案,我想知道是否有人熟悉可以实现该需求的现成库,或者是否有人可以指导我进行最佳实践。说明: 用户输入一个单词,该单词应该是几个固定选项中的一个(我将选项保存在列表中)。我知道输入必须在列表中的成员中,但由于这是用户输入,他/她可能犯了错误。我正在寻找一种算法,可以告诉我用户最可能的单词是什么。我没有任何上下文,也不能强迫用户从列表中进行选择(即,用户必须能够自由手动输入单词) 例如,假设列表包含单词“水”、“四分之一”、“啤酒”、“甜菜”、“地狱”、“你好”和“

Algorithm 确定一个角度与另一个角度的夹角是否在X度以内

我需要一个算法来计算一个角度与另一个角度的夹角是否在一定的角度范围内 我的第一个想法是(a-xb),但当它必须使用从-179到180的角度时,它就失败了 在上图中,该区域(绿色)的角度必须介于正负侧之间的包裹之间。如何确定角度(红线)是否落在该区域内?正如Marcel正确指出的那样,负数模可能存在问题。另外,355度和5度之间有什么区别?它可能被计算为350度,但10度可能是人们所期望的。我们作出以下假设: 我们需要两个其他角度之间的最小正角度,因此0尝试以下公式: 360-(|a-b|)%3

Algorithm 库存、供应链、采购管理和计算机科学-一般高级问题

我想问一个关于库存管理的比较一般的高级介绍性问题 所以,我想知道在So上是否有人有任何经验/知识,或者过去在库存、供应链、采购管理方面有过合作。在这一领域,人们可能会发现哪些典型问题或挑战,以及如何利用计算机科学,主要是算法、数据结构和优化来应对这些挑战/问题 这是否与运筹学、排队论等有关?我与这个领域没有直接关系,但我需要知道CS是如何应用于这些领域的 互联网搜索会产生一些模糊的结果,因此我非常感谢任何先前的经验、见解、有教育意义的建议、特定的在线资源,甚至是示例。我希望在这里提出这样一个高层

Algorithm 图像识别资源

我正在寻找一份介绍图像处理算法(人脸和形状识别等)的推荐书,我想知道是否有人对书籍、白皮书或网站有很好的推荐 我开始对图像识别知之甚少,在大学里做过一些数学(很久以前) 任何帮助或指点都将不胜感激。我发现这非常有用 有很多和简历相关的话题,你可能想读一读 其中一些主题: 果仁 模糊 特征脸(人脸检测) 连接组件 Canny边缘检测 梯度 类哈尔特征 梯度直方图 图像分割 关于这一主题的两本书很好: 我在一两个学期前参加的一个CV课程中使用了CV:一种现代的方法。它相当简洁,包括对这些技术如何

Algorithm Damas-Hindley-Milner型推理算法的实现

我在寻找有关著名的 对函数式语言进行类型推断,特别是关于实现的信息 我已经知道如何做了,但我听说最近的新算法基于约束生成器/解算器,而不是通常的统一。然而,我无法找到任何关于这些新算法实现的讨论 你知道我在哪里可以找到一些关于ML推断的部分信息吗?如果你对ML代码感到满意,找到这些信息的最好方法就是在野外查看实现。一个好的参考实现是,它更多地被设计为一个测试平台,而不是一个生产实现 最近几乎所有关于这些问题的严肃讨论都将在学术场合进行。一篇可能会引起兴趣的论文是 此外,Pierce的“”和App

Algorithm 查找列表中多个可能重复的整数中的任意一个

给定一个n+1整数数组,每个整数的范围在1到n之间,找到一个重复的整数 我是在一次工作面试中被问到这个问题的。我的答案是:鸽子洞原则说必须重复。我尝试使用二进制搜索方法,所以我在Matlab中这样做,因为我知道: top = 0; bot = 0; for i=1:n+1 if P[i] > n/2 top = top+1; else bot = bot+1; end 因此,我认为其中一个,top或bot,必须再次大于PhP的n/2。在那个范围内重复 我认为这是

Algorithm 作曲算法

假设我想编写一个应用程序来创作音乐 我想提供一组作曲家的乐谱,例如巴赫的《脾气好的键盘》”,节目应该准备类似风格的新乐谱 对于这项任务,算法甚至库是已知的吗 WikiPedia提供了关于的页面。您可以使用。其原理是首先产生某种音乐单元(例如,一个音符),然后根据最后产生的单元随机选择下一个单元 首先,通过输入音乐。每次你看到一个特定的音符/其他音乐单元时,只需在表格中记录它后面的内容。当你浏览完整个输入材料后,你会有一个频率表,上面列出了哪些单位遵循了这些单位(在“a”之后,“B”出现了29次,

Algorithm 如何生成尽可能不平衡的AVL树?

我在一些论文中看到了这一点,有人认为,当我们删除AVL树的一个节点时,最多可以有log(n)次旋转。我相信我们可以通过尽可能不平衡地生成AVL树来实现这一点。问题是如何做到这一点。这将对我研究移除旋转有很大帮助。非常感谢 如果你想制作一个最大不平衡的AVL树,你需要寻找一个,归纳定义如下: 阶数为0的斐波那契树为空 阶数为1的斐波那契树是单个节点 n+2阶斐波那契树是一个节点,其左子节点是n阶斐波那契树,右子节点是n+1阶斐波那契树 例如,下面是一个5阶斐波那契树: 斐波那契树表示AVL树

Algorithm 正在寻找重新排列列表的算法

我一直在尝试找出一种算法,它可以实现以下功能: 算法将得到如下列表: ((start a b c) (d e f (start g h i) (j k l) (end)) (end) (m n o)) ((start a b c (d e f (start g h i (j k l)))) (m n o)) 然后,它将包含元素start的列表与所有列表连接起来,直到包含元素end的列表。然后返回的列表应如下所示: ((start a b c) (d e f (start g h i) (j

Algorithm 是否需要有关mod 100000007问题的帮助

我数学很差,总是被那些需要以素数为模的答案所困扰 例:(500!/20!)模100000007 我熟悉大整数,但在计算500的阶乘(即使使用DP)后计算模似乎需要花费大量时间 我想知道是否有一种特殊的方法来处理这类问题 我目前正试图解决这样一个问题: 如果有人能告诉我一个教程或一种处理这些编码问题的方法,那将非常有帮助。 我熟悉java和C++,,这些大数模任务的关键不是在执行模数之前计算完整的结果。strong>您应该在中间步骤中降低模数,以保持较小的数值: 500! / 20! = 21

Algorithm Fortran算法帮助-获得错误的结果

我目前正在使用fortran矩阵计算器。我有程序编译,它似乎工作,除非我没有收到正确的结果。当我选择加法功能时,我的程序接受两个矩阵,并将它们相加。我的结果似乎是错的。例如,如果我选择两个矩阵,大小均为2x2,列表1,作为每个条目,我将收到3,3,3的加法结果。我想不出我在算法上哪里出错了。我还没有检查其他算法,因为我试图一次修复一个算法。下面是我的代码 *START PROGRAM PROGRAM MAIN *DECLARATIONS INTEGER SELECTION, D

Algorithm Haskell:递归定义函数值的有效计算

我想计算递归定义的函数值r(I,j),它们由 r i j | i<0 || j<0 = 0 | i==0 && j==0 = 1 | otherwise = (i-1) * r (i-2) j + r (i-1) (j-1) 以极其低效的方式执行(指数复杂性)。显然,Haskell为每个RIj构建了整个递归树,并忽略了先前计算的r(i-1)(j-1)等的值 什么是计算这样一个表的优雅而有效的方法?正如Fuzzxl所说,这是一个

Algorithm 洗牌一串钥匙

这个问题主要涉及一个著名的面试问题:洗牌。我在SO中找到了类似的问题,但答案大多不符合要求,或者被忽略了 给出的问题是构建一个函数来洗牌 我的解决方案:如果我将所有卡片按任何顺序放入链表中(比如排序或未排序-顺序无关紧要),这是可能的。我生成一个随机数,将其mod转换为当前的总卡数,并从链表中删除该索引以将卡存储在我的ShuffleArray中 我认为这个解决方案很棒,它有以下运行时间: O(n)用于以任何顺序构建链表。 O(n)用于将其从链接列表中删除。 O(1)用于每次生成一个随机数 对于这

Algorithm 从顺序遍历和顺序后遍历创建二叉树

我试图熟悉创建一个给定按序和后序遍历的树的问题。我写了下面的代码,但有些地方出了问题,我无法发现。有人能帮我吗 样本i/p: []中的int={4,10,3,1,7,11,8,2}; int post[]={4,1,3,10,11,8,2,7} public static TreeNode buildInorderPostorder( int post[], int n, int offset,Map<Integer,Integer> indexMap,int size) {

Algorithm 当加密算法未知时,如何解密已编码的消息

考虑到我们有以下信息: BLOCK A : 8374928304 BLOCK B : 7719 Result : 239 结果由这两个块生成,但算法未知。 但是,我有几个块和结果对。 如何找出这两个块的结果是如何生成的?您的成功主要取决于创建密码/哈希方案的实体的复杂程度。原则上,仅使用几个输入/输出对来正确识别哈希方案是非常困难的,因为可以使用无限多的方法从给定的输入生成给定的输出 你发现散列方案的唯一机会是散列方案不是很复杂,你可以猜测它是什么。以下是一些非常基本的哈希方案,如果我认为哈

Algorithm 数不胜数

假设我有一个32位整数。起初,我在这个黑盒子里植入了一些随机/秘密的东西 每次我呼叫advance,我都会得到序列中的下一个号码,但序列中的下一个号码不一定是下一个最大的号码,就像++一样,这是不可预测的。我用一个置换表来做这件事,但这需要很大的空间,我想知道是否有人知道一个特定的构造,它会给我一个基于某个种子值的确定顺序的整个范围,然后每个循环只产生一次精确的值 有人知道这样一个方案吗?托马斯·波宁(Thomas Pornin)提出了一个有趣的问题,这个问题涉及到如何设计安全(ASG) 这不是

Algorithm 基于GPU的非平衡树包容性扫描

我有以下问题:我需要基于GPU上的树结构计算值的包含扫描(例如)。这些扫描要么来自根节点(自上而下),要么来自叶节点(自下而上)。简单链的情况是,但是树结构使得并行化很难有效地实现 例如,在自顶向下的包容性扫描之后,(12)将保持(0)[op](6)[op](7)[op](8)[op](11)[op](12),而对于自下而上的包容性扫描,(8)将保持(8)[op](9)[op](10)[op](11)[op](12),其中[op]是给定的二进制运算符(矩阵加法乘法等) 还需要考虑以下几点:

Algorithm 每个节点仅使用1个额外位实现平衡因子

在《算法导论-创造性方法》一书中,问题4.18: 第4.3.4节中介绍的AVL算法需要具有三个可能值的平衡因子:1、0或-1。要表示三个值,我们需要2位。建议一种实现这些算法的方法(只需稍加修改),每个节点只需额外1位 我通过记录每个节点的高度而不是平衡因子来实现AVL树 但我不知道如何仅用1位表示三个值(1,0,-1)。我想肯定还有其他一些信息可以用来表示1,0,-1,以及1位 有人能帮我解答这个问题吗?减去高度,int balance=left->height-right->height,然

Algorithm 福特富尔克森:后缘条件

我当时正看着福特·富尔克森(ford fulkerson),对后缘感到困惑。 有人能告诉我在什么时候或者在图中考虑后缘的流量/容量条件应该是什么吗?因为我可以考虑BACKEGE的任何优势,减少了大量的流动和继续,这个过程可以继续下去。 请帮帮我 谢谢 Abhinav只有当“后缘”是从s到t的路径p的一部分时,才使用“后缘”,以便路径上所有边缘的容量都大于0(请注意,满足此要求的任何路径都会增加从s到t的流量)。如果某条边上的流已经大于0,则该边可以被视为“后边”,因此您可以“返回”该流。在这种情

Algorithm 多次使用不稳定排序是否会对数据集产生相同的结果?

希普索尔是个不稳定的人。在具有相同数据集的不同机器上使用它是否可以保证结果数据集中的顺序相同,即使它不稳定 < >编辑:实现是在不同的机器上运行的C++ STL HeAPHL排序。 只要算法是确定性的(Heapsort或任何这样的算法)在不同机器上运行它将保证相同的输出。 < P>如果你为同一实现提供相同的输入,它将输出相同的结果。这就是所谓的“决定论” 但是,唯一的例外是,如果算法是随机的(即采样/洗牌算法或随机算法)。您也可以通过向(伪)随机数生成器提供相同的种子来缓解这种情况,但是Heap

Algorithm 数据降质算法

我有一个数据库和一些数据类型,如a,B,C 我要找的是一个算法,在某个点t,告诉我们数据类型的知名度 例如,如果数据库类似于: Type | t | -----+---+ A | 0 B | 1 A | 2 A | 3 C | 4 ... | ... Let's say that B doesn't appear anymore and A appears a lot. t=100的算法将为B返回一个非常小的值,因为B只发生在t=1中,而a的值很大,因为a经常

Algorithm 字符串算法中的问题

给定仅由“a”和“b”组成的字符串,允许的操作是从字符串中删除“abb”子字符串(如果存在)。我的问题是,在应用此操作后,任何时候都不能将字符串设为空。我需要一个O(n)算法 例如, ABB-->是 aabbbb->yes,因为aabbbb->abb->empty aaabbb->aaabbb->aab之后的否 到目前为止,我所能想到的是一个O(n^2)算法,在该算法中,我使用substr()或find()成功地找到了子字符串的位置,然后将其删除,直到字符串不为空或未在其中找到“abb” 下面是

Algorithm 是否有一个例子,使工会和;用ω(q log n)中的秩运行查找没有并集的算法?

最近,我读到并惊讶地发现,仅使用路径压缩的union&find算法的时间复杂度是O((m+n)logn),其中m是“查找”查询的数量,n是“合并”查询的数量 我对这种复杂性很感兴趣,(因为我通常在实现这种算法时没有秩,甚至当我颠倒应用按秩并集时,性能也不错!)并试图找到一个可以使时间复杂性增加的示例。但是由于路径压缩的强大威力,这真的很难 是否有任何例子可以实现ω((m+n)logn),或者这种复杂性只是理论上的,而不是实际的 或者这种复杂性只是理论上的,而不是实际的 对。算法的定义是一个纯粹的

Algorithm 给定一个具有唯一边权的图G,G的所有最大生成树都是最大瓶颈树吗?

以下引述该问题的完整版本: 设G是一个有n个顶点的连通图,m条边有不同的边 重量。设T是G的树,有n个顶点和n-1条边(即a) 生成树),并将T的瓶颈边定义为T的边 以最小的重量。最大瓶颈树是一个生成树 如果不存在瓶颈边较大的生成树,则为G。证明 或提供以下陈述的反例: G的每个极大生成树都是G的极大瓶颈树 我认为,由于图具有唯一的边权重,那么G的每个生成树也是唯一的。那么G只有一棵最大生成树,如果我能证明这棵树也是一棵最大瓶颈树,那么这将证明这句话是正确的,但前提是它对所有具有唯一边权重的图都

Algorithm 搜索操作复杂性

在允许重复的未排序数组中执行搜索操作的复杂性是什么。我的猜测是O(N),因为它允许重复,所以需要搜索整个数组。但是我对算法的复杂性还不熟悉,我不能确定我的答案,请您确认我是否正确。由于数组未排序,您必须平均查看数组的一半才能找到您正在搜索的元素。因此,复杂性是线性的-O(N)。重复或不重复,同样复杂。在无序数组中搜索元素确实是O(N),因为没有启发式可以加快搜索速度。是O(N),因为在最坏的情况下,您仍然需要查看每个元素

Algorithm 使用Rand3()的随机生成器Rand9()

如何使用生成1到3之间的数字的函数生成1到9之间的数字?获得1和9之间任何数字的概率必须相同,因此rand3()+rand3()+rand3()不是一个好的解决方案。尝试笛卡尔积: Rand9() = 3 * (Rand3() - 1) + Rand3() 使用3*(Rand3()-1)可以使子区间1-3、4-6和7-9的可能性相等。使用+Rand3()时,您将在该子间隔上进行同等选择 作为产品编写: 3 * (Rand3() - 1) + Rand3() -> {1, 4, 7} X

Algorithm 给定长度与总和匹配的3位唯一序列的数目(-1,0,1)

假设您有一个长度为n(即空格数)的垂直游戏板。你有一个三面骰子,可以选择:前进一个,停留一个,后退一个。如果低于或高于棋盘游戏空间数,则为无效游戏。到达棋盘末端后,唯一有效的动作是“停留”。给定掷骰子的确切数量t,是否有可能通过算法计算出赢得比赛的唯一掷骰子的数量 到目前为止,我已经尝试为给定数量的骰子卷生成一个(-1,0,1)的所有可能组合的列表,并对列表进行排序,以查看是否有任何组合符合棋盘的长度,以及是否满足有效游戏的所有要求。但这对于掷骰子超过20的人来说是不切实际的 例如: t=1,n

Algorithm 求最长零和子序列 警告:这不是“查找和为零的最长子阵列”问题的实例

我想知道是否有任何算法可以找到序列中和为零的最大子序列的长度(即元素可以是连续的或不连续的),例如 S = {1, 4, 6, -1, 2, 8, -2} ^ ^ ^ ^ maximum length = 4 我搜索了它,但没有找到任何这是问题的一个微小变化 设d[i]=与i之和的子序列的最大长度。最初,这都是零。如果你的数字都是正数,你可以: s = 0 for i = 1 to n: s += a[i] for j = s down t

Algorithm 如何找到包含所有点或与y=x轴对称的点的最小矩形?

我有一组点(x,y)。如何找到包含这些点或与y=x轴对称的点的最小矩形(边垂直于坐标系的轴)?并非所有的点都必须同时是镜像,因此有可能与原始点有一些法线和一些对称点。您可以使用蛮力O(n*2^n)方法解决此问题:将点定义为一些类/结构,除了点的(x,y)坐标,还保存布尔镜像状态。对于n点数,循环检查这组点数的所有2^n可能的状态集。对于每组状态,计算边界矩形的周长(2x+2y) 以下是在Swift中实施的此解决方案。如果你选择使用这种暴力手段,希望你能把它翻译成你选择的语言 点容器和帮助功能:

Algorithm 是否有一种算法可以在固定时间内返回堆栈中的第二大元素?

我知道如何使用存储最大值的辅助堆栈对堆栈中的最大元素执行此操作。想知道这是否可以扩展以在恒定时间内返回max和second max。您可以为second max创建第二个辅助堆栈。以下是插入一些数字后的最小值和第二最小值辅助堆栈的示例: Actual Stack 16 <--- top 15 29 19 18 Auxiliary Stack 15 <---- top 15 18 18 18 Second Auxiliary Stack 18 <---- top 18

Algorithm BST中每个节点到叶的最长路径

对于BST中的每个节点,从节点到叶的最长路径的长度是多少?(最坏情况) 我认为在最坏的情况下,我们有一条从节点到叶子的线性路径。如果树中有n个节点,则运行时间为O(n*n)。这是对的吗?假设是“每个叶的一个给定节点”或“每个叶的每个节点”。如果是“每个叶的每个节点”,这就有点难了 要做到这一点:从“目标”走到根部,按距离标记每个节点;将所有这些节点都涂成红色。(因此,根保持目标的深度,目标保持0)。对于每个红色节点,从红色节点的值开始,遍历其非红色子节点,并在下降时添加1 这不是O(n*n),因

Algorithm 修改选择排序。理论上似乎是正确的,但事实并非如此;我不能给出结果

我正在学习ruby,我正在学习和实现排序算法。在处理选择排序时,我尝试对其进行如下修改: 在每个过程中,不是找到最小的并将其移动到数组的顶部或开头,而是找到最小的和最大的并将其移动到数组的两端 对于每个过程,增加必须循环通过的数组的开始位置,减少结束位置 交换时,如果标识的最小值和最大值处于相互交换的位置,则交换一次(否则,将进行两次交换,一次交换最小值,一次交换最大值) 这似乎并非在所有情况下都有效。我在逻辑上遗漏了什么吗?如果逻辑是正确的,我将重新审视我的实现,但目前我还无法找出哪里出了

Algorithm O(3^logn)是否可以重写为O(n^log3)?

O(3logn)的时间复杂度是否可以等于或重写为O(nlog3)?这里的对数基数是2。简短回答:是 原因很简单,尽管看起来令人惊讶,但这两个函数是相等的。让我们使用以下符号: ln(x)是自然对数 log(x)是以2为底的对数 证据: 我们知道,ln(a^b)=b*ln(a)和log(x)=ln(x)/ln(2)。我们将这些公式应用于两个函数: ln(3^log(n))=log(n)*ln(3)=ln(n)*ln(3)/ln(2) ln(n^log(3))=log(3)*ln(n)=ln(

Algorithm 时间表在限定时间内的最低成本?

我有这样的时间表: +-----------+-------------+------------+------------+------------+------------+-------+----+ | transport | trainnumber | departcity | arrivecity | departtime | arrivetime | price | id | +-----------+-------------+------------+------------+-

Algorithm 算法设计技术

根据公式2^n=2^(n-1)+2^(n-1),设计一个递归算法,用于计算任意非负整数n的2^n。 前提条件:必须执行添加操作 int computepowerOfTwo(int power) { if(power == 1) return 1; else return (2*computepowerOfTwo(power-1)) + (2*computepowerOfTwo(power-1)) } 当我以3开头供电时,它会在代码中返回1

Algorithm 最坏情况时间复杂度为O(n)的算法是否总是比最坏情况时间复杂度为O(n^2)的算法快?

这个问题出现在我的算法课上。以下是我的想法: 我认为答案是否定的,最坏情况时间复杂度为O(n)的算法并不总是比最坏情况时间复杂度为O(n^2)的算法快 例如,假设我们有总时间函数S(n)=9999999 n和T(n)=n^2。很明显,S(n)=O(n)和T(n)=O(n^2),但对于所有n

Algorithm f#中使用seq的连分数

嗨,有没有办法用seq而不是list来解f#中的连分数 let cfToScalar cf = List.foldBack (fun elem acc -> float elem + (1.0 / float acc)) cf System.Double.MaxValue 类似这样的事情,但我想使用seq而不是List,正如我在评论中所说,您可以将List.foldback更改为seq.foldback,您的函数现在将接受序列。另请注意,正如Sehnsucht所说,折叠的当前实现需要转换

Algorithm PID算法在直线跟踪机器人中的实现

我正在使用NXT mindstorms套件进行一个小项目。我的意图是制造一个机器人,它可以非常平稳地、尽可能快地沿着直线移动。因此,经过一个小的研究,我找到了PID算法,我能够理解并将该算法实现到一个NXC代码中。机器人刚刚根据算法做了所有正确的事情,但当线路中断(间隙)时,机器人失去了线路,无法回到线路上。问题是,当差距达到9厘米时,他可以回来,但10分钟后他就失去了底线。我用的是一个光传感器。有没有办法调整PID代码来解决这个问题 我的代码: // kd ,ki kp are als

Algorithm 按周顺序对时间戳进行分组的快速方法

全部: 我想知道是否有简单的方法按周的顺序对时间戳进行分组,例如: 一个月通常有5到4个星期,只要有时间戳(类似UTC时间1483465353929,即2017年1月3日,应放入第一周组,例如我们使用一个月的第一个星期一作为该月第一周的开始,如果时间戳早于2017年1月1日的第一个星期一,则应放入上个月的最后一周组,即第五周)如何快速确定其周订单?如有任何实施,将不胜感激。 谢谢你能证明你在解决这个问题上做了什么吗?@ScottHunter谢谢你的回复。我想的是首先根据时间戳算出那个月的第一个星

Algorithm 四元组合时间复杂度

我遇到了这个问题:给定一个数字数组arr和一个数字S,在arr中找到4个不同的数字,它们的总和为S 如果解决方案是: function findArrayQuadCombination(arr, S): if (arr == null OR S == null): return null n = length(arr) if (n < 4): return null # hashing implementation language depe

Algorithm Max-Heapify伪码

我对Max Heap Sort伪代码的一部分感到困惑。 减到2是什么意思 HeapSort(A) Build-Max-Heap(A) for i <-- length[A] down to 2 do exchange A[1] <---> A[i] heap-size[A] = heap-size[A] -1 Max-Heapify(A,1) HeapSort(A) 构建最大堆(A) 对于i,这意味着对{length[A],length[A]-1,length[A]-2,…,

Algorithm NP类的复杂性

既然p问题是这样的问题,解决它们所需的算法可以在多项式或更短的时间内完成,那么公平地说,NP问题是这样的问题,即不存在多项式算法来解决它吗 基本上,所有需要算法复杂度超过多项式的问题都被认为是NP问题吗 p=NP基本上也是这样说的,“有没有一种方法可以解决那些一直以来都是用比多项式时间更长的算法来解决的问题,但这次是用多项式时间来解决的?”这是不正确的。要获得正确的定义,请使用谷歌。有关简要说明: NP不代表“非多项式时间”,它代表“非确定性多项式时间”。粗略地说,这意味着一个解决方案可以在多项

Algorithm 算法中的模逆

我正在阅读Sanjoy das gupta的算法书中的扩展欧几里德算法,链接第33页 假设我们希望计算11^-1 mod 25。 使用扩展的欧几里德算法,我们发现15*25-34*11=1。将两边的模减为25,我们得到-34*11全等等于1 mod 25。所以-34同余等于16模25是11模25的倒数 我的问题是,作者如何从前面的陈述中得出“-34同余等于16模25是11模25的倒数。”因为15*25-34*11=1你有15*25-34*11=1模25,这导致-34*11=1模25 如果有a*

Algorithm 从二维阵列创建邻接矩阵

我有一个如下所示的数组: a b c d e f g h j k l m n o p q 我的想法是创建一个仅用于水平和垂直移动的邻接矩阵,其中成本是目标中的ASCII值 该解决方案将找到以下类型的邻接矩阵(简化的“a”=1): 像所有上帝的问题一样,我需要一些纸和笔。解决方案似乎是以下代码,其中“M”是原始矩阵,“adj”是生成的尺寸为x和y的邻接矩阵: makeAdjacencyMatrix(M,adj) for row = 0 .. y do for col = 0 ..

Algorithm 用k位集快速计算大小为b的第n个位序列?

我想开发一种能够用k位集(等于1)表示所有b位组合的方法。它需要一种方法,给定一个索引,可以快速得到相关的二进制序列,反之亦然。例如,我认为传统的方法是按顺序生成数字,如: 对于b=4和k=2: 0-0011 1-0101 2-0110 3-1001 4-1010 5-1100 如果给我序列“1010”,我希望能够快速生成数字4作为响应,如果给我数字4,我希望能够快速生成序列“1010”。然而,我无法想出一种方法来做这些事情,而不必生成所有之前(或之后)的序列。 无需按该顺序生成序列,您可以执行

Algorithm 表达式求值算法 我写的是一个C++程序,必须分析并评估这样一个字符串中的表达式: ((C<3) || (D>5)) and (B)

表达式的计算结果将始终为true或false。我读过关于调车场算法的书,但操作顺序对我来说并不重要,我可以从左到右陈述评估结果 我正在考虑构建一棵树来保存公式的组成部分,然后从左下角向上递归地计算该树。节点的每个子节点都是一个,每个节点都是一个测试。如果在当前状态为true时到达最顶端的节点,则其计算结果必须为true。这是一个艰难的开始…寻求建议 是否有一个算法设计模式来实现这一点?似乎这个问题以前已经解决过很多次了我建议你花时间和精力学习适合这个问题的词法分析工具。Flex用于词法分析,获取

Algorithm 如何计算该函数的增长率:T(n)=2T(n^(1/2))+;2(n^(1/2))

我需要为我的作业计算此函数的增长率: T(n) = 2T( n^(1/2) ) + 2( n^(1/2) ) 换言之: T(n) = 2T( sqrt(n) ) + 2( sqrt(n) ) 更改变量可能会有所帮助(例如n=2^m) 我找到的答案是log(n)*log(log(n)),但我知道这是不正确的。n=2^m确实是正确的变量替换。定义一个函数S(m): 扩展: S(m) = 4*S(m/4) + 2*2^[m/4+1] + 2^[m/2+1] = 8*S(m/8)

Algorithm 查找从矩阵顶行到底行的所有路径的简单方法

给定一个矩阵a,如果每个“1”可以与下面一行中与其相邻的3个元素连接(除了边1(如果有),它们显然与2连接),您将如何找到从第1行到最后一行的所有可能路径的数量 我正在寻找在不使用复杂的特定语言库或函数的情况下实现这一点的方法 我正在使用fortran95,已经尝试了几个小时,但仍然无法获取所有路径 A= 您可以使用的稍微修改来解决此问题。本质上,我们将二维网格视为一个隐式图,其中每个单位正方形是一个顶点,如果其中一个顶点直接位于另一个顶点之上或对角位于另一个顶点之上,则两个顶点是连接的。不幸的

Algorithm 快速查找第一个和最后一个字符在其中重复的子字符串数的方法

这是关于我创建的子字符串的问题。我想知道如何实现这个问题的O(nlog(n))解决方案,因为这种简单的方法非常简单。事情是这样的。您有一个字符串SS有许多子字符串。在某些子字符串中,第一个字符和最后一个字符存在不止一次。查找第一个和最后一个字符多次出现的子字符串数 输入:“ABCDCBE” 预期产出:2 说明:“BCDCB”和“CDC”是两个这样的子字符串 该测试用例解释只有“BCDCB”和“CDC”,其中第一个字符和最后一个字符相同 除了示例之外,还有另一种情况,“ABABCAC”作为子字符