Questions tagged «efficiency»

解决问题时,尽可能少地使用资源(例如时间,空间)。如果您的问题专门与资源使用有关,而不是碰巧提到运行时间的通用算法问题,请使用此标记。


4
为什么多项式时间称为“有效”?
为什么在计算机科学中将最多多项式的复杂度视为有效的? 对于任何实际应用(a)来说,复杂度为的算法比及时运行的算法(即要快得多,但是前者被认为效率低下,而后者是有效的。逻辑在哪里?nlognnlog⁡nn^{\log n}n80n80n^{80} (a)例如,假设宇宙中的原子数约为。1080108010^{80}


3
阶乘算法比朴素乘法更有效
我知道如何使用迭代和递归(例如n * factorial(n-1),例如)为阶乘编码。我读过一本教科书(没有给出任何进一步的解释),发现通过递归将因式分解成两半,有一种更有效的编码方式。 我知道为什么会这样。但是我想尝试自己编码,但是我不知道从哪里开始。一位朋友建议我先写基本案例。我当时在考虑使用数组,以便可以跟踪数字...但是我真的看不出设计这种代码的任何出路。 我应该研究哪种技术?

5
将元素添加到排序数组
最快的方法是什么(从算法的角度以及实际的角度来看)? 我在按照以下思路思考。 我可以添加到数组的末尾,然后使用Bubblesort,因为它的最佳情况(开始时是完全排序的数组)接近于此,并且具有线性运行时间(最佳情况)。 另一方面,如果我知道我是从排序数组开始的,则可以使用二进制搜索来查找给定元素的插入点。 我的直觉是,第二种方法几乎是最优的,但好奇地想知道那里有什么。 如何最好地做到这一点?


3
为什么选择排序比气泡排序快?
维基百科上写道:“ ...选择排序几乎总是胜过气泡排序和侏儒排序。” 任何人都可以向我解释为什么选择排序比气泡排序更快的原因,尽管它们都具有: 最坏情况下的时间复杂度:Ø( ñ2)O(n2)\mathcal O(n^2) 比较数: Ø( ñ2)O(n2)\mathcal O(n^2) 最佳案例时间复杂度: 气泡排序:O(n )O(n)\mathcal O(n) 选择排序:Ø( ñ2)O(n2)\mathcal O(n^2) 平均案件时间复杂度: 气泡排序:Ø( ñ2)O(n2)\mathcal O(n^2) 选择排序:Ø( ñ2)O(n2)\mathcal O(n^2)

2
高效的地图数据结构,支持近似查找
我正在寻找一种数据结构,该结构支持有效的键近似查找(例如,字符串的Levenshtein距离),并为输入键返回最接近的匹配项。到目前为止,我找到的最合适的数据结构是Burkhard-Keller树,但是我想知道是否还有其他/更好的数据结构用于此目的。 编辑:我的具体情况的更多详细信息: 字符串之间的Levenshtein差异通常很大。 字符串的最大长度约为20到30个字符,平均长度接近10到12个字符。 我对有效查找比对插入更感兴趣,因为我将构建一组要有效查询的大部分静态数据。

3
检索动态图的最短路径
我目前正在研究有向图中的最短路径。有许多有效的算法可用于查找网络中的最短路径,例如dijkstra算法或bellman-ford算法。但是,如果图形是动态的,该怎么办?我说动态是指我们可以在程序执行期间插入或删除顶点。我正在尝试找到一种有效的算法,用于在插入边e之后更新从顶点到每个其他顶点u的最短路径,而无需在新图中再次运行最短路径算法。我怎样才能做到这一点?提前致谢。vvvüuuËee 注意:更改可以在算法的第一次迭代后完成 注[2]:两个节点中给出,源和Ť目标。我需要找到这些节点之间的最短路径。当图形更新时,我只需要更新π (s ,t ),这是s和t之间的最短路径。sssŤttπ(s ,t )π(s,t)\pi(s,t)sssŤtt 注意[3]:我只对边缘插入盒感兴趣。 正式定义:给定一个图。定义一个更新操作作为1)的边缘的插入ë到ë或2)的边缘的氨基酸缺失ë从ë。目的是有效地找到更新操作后所有对最短路径的成本。有效地,我们的意思至少比每次更新操作后执行All-Pairs-Shortest-Path算法(例如Bellman-Ford算法)更好。G = (V,E)G=(V,E)G = (V,E)ËeeËEEËeeËEE 编辑:下面是问题的简化版本: 给出了一个加权图,该图由单向边以及两个关键顶点s和t组成。还给出了候选双向边缘的集合C。我必须建立一个边缘(Û ,v )∈ Ç以最小化从距离小号到吨。ģ (V,E)G(V,E)G(V,E)sssŤttCCC(Û ,v )∈ Ç(u,v)∈C(u,v) \in CsssŤtt

3
什么时候AKS素数测试实际上比其他测试快?
我试图了解我如何了解AKS素数测试,例如证明PRIMES⊆P的推论,或用于计算机素数测试的实际实用算法。 该测试具有多项式运行时,但具有高度和可能的高常数。那么,实际上,在哪一个nnn方面超过其他素性检验?在这里,nnn是质数的位数,“超越”是指典型计算机体系结构上测试的大概运行时间。 我对功能上可比的算法感兴趣,这是确定性的算法,不需要为正确性而猜测。 另外,考虑到测试的内存需求,在其他测试中使用这种测试是否可行?

7
一个在两个数组中不同的元素。如何有效地找到它?
我正在准备进行编码面试,但我真的想不出解决此问题的最有效方法。 假设我们有两个数组,这些数组由未排序的数字组成。数组2包含一个数字,数组1没有。两个数组都有随机定位的数字,不一定以相同的顺序或相同的索引。例如: 阵列1 [78,11,143,84,77,1,26,35 .... n] 数组2 [11,84,35,25,77,78,26,143 ... 21 ... n + 1] 找到不同数字的最快算法是什么?它的运行时间是多少?在此示例中,我们要查找的数字是21。 我的想法是遍历数组1并从数组2中删除该值。迭代直到完成。这应该在O(nlogn)O(nlog⁡n)O(n \log n)运行时间左右,对吗?

3
计算素数模的阶乘最有效的方法是什么?
您知道有什么算法可以有效地计算模后阶乘吗? 例如,我要编程: for(i=0; i<5; i++) sum += factorial(p-i) % p; 但是,p直接应用阶乘是一个很大的数字(素数)。(p≤108)(p≤108)(p \leq 10^ 8) 在Python中,此任务确实很容易,但是我真的很想知道如何优化。

6
在一个间隔中找到两个数字的最大异或:我们能做得比二次更好吗?
lllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r 天真的算法只检查所有可能的对。例如在红宝石中,我们有: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j > max) max = i ^ j end end end max end 我感觉到,我们可以做得比二次。是否有针对此问题的更好算法?

2
是否可以避免合并排序中的“除法”步骤?
因此,合并排序是一种分而治之的算法。在查看上图时,我在考虑是否有可能基本上绕过所有划分步骤。 如果您在原始数组上跳两次时迭代原始数组,则可以在索引i和i + 1处获取元素,然后将它们放入自己的排序数组中。一旦拥有所有这些子数组(如图所示,[[7,14],[3,12],[9,11]和[2,6]),您就可以简单地进行常规合并例程来获取排序数组。 遍历数组并立即生成所需的子数组是否比整体执行除法步骤效率低?

7
我们可以说DFA比NFA更有效吗?
我刚刚开始阅读有关计算理论的文章。如果我们比较哪个更强大(在接受字符串中),则两者是相同的。但是效率呢?与NFA相比,DFA的速度更快,因为它只有一个传出的优势,而且不会产生歧义。但是在NFA的情况下,我们必须检查所有可能的情况,这肯定需要时间。那么我们可以说DFA比NFA更有效吗? 但是,我的另一部分大脑也认为NFA仅存在于理论上,因此我们无法将其效率与DFA进行比较。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.