Questions tagged «runtime-analysis»

有关用于估计随着输入大小增加算法的运行时间增加的方法的问题。

1
蛮力Delaunay三角剖分算法的复杂度
在马克·德·伯格等人的“计算几何:算法和应用”一书中,有一种非常简单的蛮力算法,用于计算Delaunay三角剖分。该算法使用了非法边的概念-可能不会出现在有效Delaunay三角剖分中的边,必须用其他一些边替换。在每个步骤中,该算法仅查找这些非法边缘并执行所需的位移(称为“ 边缘翻转”),直到没有非法边缘为止。 算法LegalTriangulation(TTT) 输入。一些三角TTT点集的PPP。 输出。的合法三角剖分PPP。 而 TTT包含非法边缘pipjpipjp_ip_j do \quad让pipjpkpipjpkp_i p_j p_k和pipjplpipjplp_i p_j p_l邻近于两个三角形pipjpipjp_ip_j。 \quad从T删除,然后添加p k p l。返回牛逼。pipjpipjp_ip_jTTTpkplpkplp_kp_l TTT 我听说这种算法在最坏的情况下会在时间内运行;但是,我不清楚这句话是否正确。如果是,如何证明这一上限?O(n2)O(n2)O(n^2)

3
Brzozowski的DFA最小化算法
Brzozowski的DFA最小化算法可通过以下方式为DFA建立最小的DFA :GGG 反转所有边,使初始状态为接受状态,而接受状态为初始,以获得反向语言的NFA,N 'GGGñ′ñ′N' 使用powerset构造获得反语言的,G′G′G' 反转的边(和初始接受交换)以获得原始语言的NFA,并且 ÑG′G′G'ññN 进行powerset构造以获得。G分G分G_{\min} 当然,由于某些DFA具有指数较大的反向DFA,因此根据输入的大小,此算法在最坏的情况下会以指数形式运行,因此,请跟踪反向DFA的大小。 如果ññN是输入DFA 的大小,ññn是最小DFA 的大小,而米米m是最小反向DFA的大小,那么按照ññN,ññn和m计,Brzozowski算法的运行时间是米米m多少? 特别是,在ññn和m之间有什么关系时,米米m布佐佐夫斯基的算法优于霍普克罗夫特算法或摩尔算法? 我听说在实践/应用中的典型示例中,Brzozowski的算法优于其他算法。非正式地,这些典型示例是什么样的?


2
算法时间分析“输入大小”与“输入元素”
在分析和描述算法的无症状上限时,我仍然对术语“输入长度”和“输入大小”感到困惑 似乎算法的输入长度取决于您所讨论的数据和算法的种类。 一些作者将输入长度称为表示输入所需的字符大小,因此,如果在算法中用作输入集,则“ abcde”将具有6个字符的“输入长度”。 如果不是字符而是数字(例如整数),则有时使用二进制表示形式代替字符,因此“输入长度”被计算为(等于输入集中的最大数字L)。N∗log(L)N∗log(L)N*log(L) 还有其他问题,即使输入集是数字,它们也会将“输入长度”描述为“决策变量”,因此对于长度为N且数字范围为的输入集,输入长度为只是N(例如,子集和),甚至使陈述问题所用的二进制位值的数量更加复杂(我相信这与) N ∗ l o g (L )0−2320−2320-2^{32}N∗log(L)N∗log(L)N*log(L) 所以: 这取决于算法? 什么意思以及何时使用每个输入长度“版本” 我可以使用一些规则来决定使用哪个规则吗?

1
Knuth的线性时间乘法算法为什么不“计数”?
维基百科有关乘法算法的页面提到了Donald Knuth的有趣文章。基本上,它涉及将傅立叶变换乘法与对数大小的乘法的预计算表进行组合。它以线性时间运行。 本文的行为就像这种算法,某种程度上不算作“真正的”乘法算法。更重要的是,是否可以在偶数O(n lg n)时间内完成乘法是一个悬而未决的问题! 此算法的哪些细节使它不算作“真实”乘法算法? 我的猜测是: 预先计算表格所花费的时间超过了线性时间。另一方面,它仍然可以及时完成,n lg n因此看起来仍然令人印象深刻。 某种程度上不允许随机访问。但是,为什么其他算法可以使用哈希表和指针之类的东西呢? 当您增加机器的字长时,它会以某种方式缩放错误,例如,如果您有一台256位机器在一条指令中执行256位乘法,那么直到您拥有2 ^ 256个以上的元素,该算法才有意义。另一方面,我们在联合发现中担心逆阿克曼因子。 “有没有线性时间乘法算法?” 问题是用一些功能较弱的机器暗中进行的,但这只能得到提示。

2
Aho-Corasick算法和Rabin-Karp算法的比较
我正在研究支持多模式搜索的字符串搜索算法。我发现了两种算法,它们在运行时间方面似乎是最强的候选者,分别是Aho-Corasick和Rabin-Karp。但是,我找不到这两种算法之间的任何全面比较。哪种算法更有效?另外,哪一种更适合并行计算和多模式搜索?最后,哪个需要更少的硬件资源? 对于AC算法,搜索阶段需要时间,而对于RK ,搜索阶段则为。但是,RK的运行时间为,这使其类似于AC。我的初步结论是,RK看起来实际上更好,因为它不需要像AC一样多的内存。那是对的吗?O (n + m )Ø(ñ+米)O(n+m)O (n 米)Ø(ñ米)O(nm)O (n + m )Ø(ñ+米)O(n+m)

2
简化n个多选k的复杂度
我有一个递归算法,其时间复杂度相当于从n中重复选择k个元素,我想知道是否可以得到一个更简化的big-O表达式。在我的情况下,可能大于并且它们独立增长。kkknnn 具体来说,我期望一些显式的指数表达式。到目前为止,我能找到的最好的结果是基于Stirling的近似值,所以我可以使用它,但是我想知道是否可以得到更好的东西。O(n!)≈O((n/2)n)O(n!)≈O((n/2)n)O(n!) \approx O((n/2)^n) O((n+k−1k))=O(?)O((n+k−1k))=O(?)O\left({{n+k-1}\choose{k}}\right) = O(?)


2
是否有用于实验比较运行时的标准?
我的情况 我正在写一篇论文,介绍我开发的软件模块,并且想将其运行时间与同一任务的其他模块进行比较。我知道运行时实验的弊端,但请假设在我的情况下无法解决它。(我可以并且确实可以从理论上推论出某些属性,但是并不能满足所有要求。) 我想用于基准测试的特定方案有两个参数:问题的复杂度 和确定详细问题的随机种子 r。我主要想展示对n的依赖 。根据初步研究和理论,r对运行时的影响很小或可以忽略。单个任务最多需要十分钟才能完成。nnnrrrnnnrrr 实际问题 我正在寻找一些进行此类实验的公认或公开程序,或者至少要列出一些常见的陷阱(理想情况下已发布)。 我到目前为止发现的 没有。互联网搜索会产生各种各样无关的结果,但是我可能没有使用正确的术语。包括最低关键字(我知道这是一个很好的标准)(请参见下文)也没有帮助。 我会怎么做 尽可能在禁用了GUI等潜在干扰软件的情况下,在同一台计算机上运行所有实验。 使所有模块经受场景的相同选择,即,相同的和 r。nnnrrr 对于每种情况,请以随机顺序彼此直接直接测试不同的模块。换句话说,不同模块之间的循环是最里面的模块。这应避免由于机器性能的缓慢波动(例如,由于温度变化)而对不同模块造成偏差。随机顺序应避免由于诸如缓存之类的影响而产生偏差,或者避免一个模块总是在同一模块之后进行测试。 nnn


2
乘法
我一直在寻找在这里,我注意到两个乘法的最佳运行 -Bits数是Ø (ñ ⋅ 登录ň ⋅ 2 Ø (日志* ñ ),但我可以很容易发现的算法,在运行Ø (ñ ⋅ 登录n )。nñnO(n⋅logn⋅2O(log∗n)Ø(ñ⋅日志⁡ñ⋅2Ø(日志∗⁡ñ)O(n\cdot \log n \cdot 2^{O(\log^* n)}O(n⋅logn)Ø(ñ⋅日志⁡ñ)O(n\cdot \log n) 毕竟,我们知道如何在O (n log n )运行时中将两个多项式相乘。但是多项式相乘与两个n位数字相乘相同。因此,我们有一种算法将O (n log n )中的两个n位数字相乘。现在可能发生的唯一问题是进位,但是在每个阶段中,我们都可以在O (n )时间内解决此问题,只需移动最右边的位及其左邻居,直到结束。也就是说,我们的运行时间应保持Ø (ñ ⋅ 日志ñnñnO(nlogn)Ø(ñ日志⁡ñ)O(n \log n)nñnnñnO(nlogn)Ø(ñ日志⁡ñ)O(n \log n )O(n)Ø(ñ)O(n)。O(n⋅logn)Ø(ñ⋅日志⁡ñ)O(n \cdot \log n) 那我做了一个新的(而且很明显)的发现吗?还是维基百科页面过时了?也许我有一些错误?

1
查找最长斐波那契子串的幼稚算法的复杂性
给定两个符号和b,我们如下定义第k个斐波那契字符串:一个a\text{a}bb\text{b}ķkk F(k )= ⎧⎩⎨b一个F(ķ - 1 )⋆ ˚F(k − 2 )如果 k=0如果 k=1其他F(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else F(k) = \begin{cases} \text{b} &\mbox{if } k = 0 \\ \text{a} &\mbox{if } k = 1 \\ F(k-1) \star F(k-2) &\mbox{else} \end{cases} 与表示字符串连接。⋆⋆\star 因此,我们将拥有: F(0 )= bF(0)=bF(0) = \text{b} F(1 )= 一个F(1)=aF(1) = \text{a} F(2 …

1
潜在函数二进制堆提取最大值O(1)
我需要帮助来确定最大堆的潜在函数,以便在摊销时间内完成提取最大。我还要补充一点,就是我对潜在方法没有很好的了解。O(1)O(1)O(1) 我知道insert函数应该“付出更多”以减少提取的成本,这必须要考虑到堆的高度(如果给出了堆应该是或)⌊log(n)⌋⌊log⁡(n)⌋ \lfloor \log(n) \rfloor 2log(n)2log⁡(n)2\log(n)∑nk=12log(k)∑k=1n2log⁡(k) \sum_{k=1}^n 2\log(k)

3
CLRS的D元堆问题
解决以下问题时我感到困惑(问题1-3)。 题 甲d进制堆就像是一个二进制堆,但(带有一个可能的例外)非叶节点具有d孩子而2个孩子。 您将如何在数组中表示d -ary堆? n个元素的d元堆的高度分别是n和d? 在d -max-heap中给出EXTRACT-MAX的有效实现。根据d和n分析其运行时间。 在d-最大堆中给出INSERT的有效实现。根据d和n分析其运行时间。 给出INCREASE-KEY(A,i,k)的有效实现,如果k <A [i] = k,则标记一个错误,然后适当地更新d -ary矩阵堆结构。根据d和n分析其运行时间。 我的解决方案 给一个数组A [ a1个。。一个ñ]一个[一个1个。。一个ñ]A[a_1 .. a_n] 根1级2级等级k:一个1个:一个2… 一个2 + d− 1:一个2 + d… 一个2 + d+ d2− 1⋮:一个2 + ∑我= 1k − 1d一世… 一个2 + ∑我= 1ķd一世− 1根:一个1个1级:一个2…一个2+d-1个2级:一个2+d…一个2+d+d2-1个⋮等级k:一个2+∑一世=1个ķ-1个d一世…一个2+∑一世=1个ķd一世-1个\qquad \begin{align} \text{root} &: a_1\\ \text{level 1} &: …

1
分段求和问题的分段树实现的时间复杂度证明
我知道可以使用段树来找到的子数组的总和。根据此处的教程,该操作可以在时间内完成。一个AAO(对数n )O(log⁡n)\mathcal{O}(\log n) 但是我无法证明查询时间确实是。此链接(以及许多其他链接)说,我们可以证明在每个级别上,已处理的最大节点数为,因此。O(对数n )O(log⁡n)\mathcal{O}(\log n)444O(4对数n )= O(对数n )O(4log⁡n)=O(log⁡n)\mathcal{O}(4 \log n) = \mathcal{O}(\log n) 但是,我们怎么可能通过矛盾来证明这一点呢? 如果是这样,如果我们将分段树用于高维数组的范围和,该证明将如何扩展? 例如,我可以考虑通过将原始矩阵划分为4个象限(类似于线性阵列中的一半)来找到一个子矩阵总和,以构建一个象限分段树,但是证明使我难以理解。

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.