Questions tagged «algorithm-analysis»

有关确定算法属性的科学和技术的问题,通常包括正确性,运行时和空间使用情况。使用[runtime-analysis]标记可查询有关算法运行时间的问题。

2
为什么DFS被认为具有空间复杂度?
根据这些说明,DFS被认为具有空间复杂度,其中是树的分支因子,是状态空间中任何路径的最大长度。O (b m )O(bm)O(bm)bbb米mm 在此Wikibook页面上的“ 不知情的搜索”中也是如此。 现在,有关DFS的Wikipedia文章的“信息框” 针对算法的空间复杂性提供了以下内容: O (| V| )O(|V|)O(|V|),如果遍历整个图而没有重复,则最长路径搜索长度为隐式图,而不会消除重复的节点O (O(O())) 这更类似于我认为DFS的空间复杂度,即,其中是算法达到的最大长度。O (米)O(m)O(m)米mm 我为什么认为是这种情况? 好吧,基本上,我们不需要存储除当前正在查看的路径的节点以外的任何其他节点,因此在Wikibook和我推荐给您的注释提供的分析中,没有必要乘以至。bbb 此外,根据Richard Korf 在IDA *上发表的这篇论文,DFS的空间复杂度为,其中被视为“深度截止”。Ø (d)O(d)O(d)ddd 那么,DFS的正确空间复杂度是多少? 我认为这可能取决于实现方式,因此,我希望能对不同已知实现方式的空间复杂性做出解释。

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

1
函数式编程语言实现的算法复杂度分析
我今天了解到,算法分析基于计算模型而有所不同。这是我从未想过或从未听说过的事情。 @chi用户给我的示例进一步说明了这一点: 例如,考虑任务:给定 返回 。在RAM中,这可以在解决, 因为数组访问是固定时间的。使用TM,我们需要扫描整个输入,所以它是(i,x1,…,xn)(i,x1,…,xn)(i,x_1 ,…,x_n )xixix_iO(1)O(1)O(1)O(n)O(n)O(n) 这使我对功能语言感到疑惑。从我的理解,“函数式语言是密切相关的演算”(由尤瓦Filmus一个评论对这里)。因此,如果功能语言基于lambda演算,但它们在基于RAM的计算机上运行,​​那么对使用纯功能数据结构和语言实现的算法进行复杂度分析的正确方法是什么? 我没有机会阅读“ 纯粹的功能数据结构”,但是我浏览了Wikipedia页面上的主题,并且似乎某些数据结构确实用以下方法代替了传统的数组: “数组可以用映射或随机访问列表替换,这允许使用纯功能实现,但是访问和更新时间是对数的。” 在那种情况下,计算模型会有所不同,对吗?


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
使用对抗参数找到第k个最小元素的下界
在许多文本中,使用中位数的自变量得出了找到第个最小元素的下限。如何使用敌对参数找到一个?kkk 维基百科说锦标赛算法运行在,并且被给定为下限。O(n+klogn)O(n+klog⁡n)O(n+k\log n)n−k+∑nj=n+2−k⌈lgj⌉n−k+∑j=n+2−kn⌈lgj⌉n - k + \sum_{j = n+2-k}^{n} \lceil{\operatorname{lg}\, j}\rceil

3
识别Watson-Crick回文的空间复杂性
我有以下算法问题: 确定识别作为Watson-Crick回文的DNA字符串的空间图灵复杂性。 Watson-Crick回文是指其原始字符串反向排列的字符串。的补体被定义信明智的,通过DNA启发:A是T的补体和C是G.一个简单的例子的用于WC-回文的补ACGT。 我提出了两种解决方法。 一个需要空间。O(n)O(n)\mathcal{O}(n) 一旦机器完成读取输入。输入磁带必须以相反的顺序复制到工作磁带上。 然后,机器将从左侧读取输入和工作带,并比较每个条目,以验证工作带中的单元格是输入单元格的补充。这需要空间。O(n)O(n)\mathcal{O}(n) 另一个需要空间。O(logn)O(log⁡n)\mathcal{O}(\log n) 在读取输入时。计算输入磁带上的条目数。 输入磁带读完后 将信件的补语复制到工作带上 将字母L复制到工作带的末尾 (循环点)如果计数器= 0,请清除工作带并输入是,然后暂停 如果输入磁带显示L 将输入头向左移动计数器指示的次数(需要第二个计数器) 如果输入磁带显示R 将输入头向右移动计数器指示的次数(需要第二个计数器) 如果保存在工作带上的值的单元格与输入磁带上的当前单元格匹配 将计数器减2 向左或向右移动一个,分别取决于R或L在工作带上 将L或R的补语复制到工作带以代替当前的L或R 继续循环 如果值不匹配,请清除工作带并输入否,然后暂停 这大约占空间,用于存储两个计数器,当前补码和值L或R。2logn+22log⁡n+22\log n+2 我的问题 第一个需要线性时间和空间。第二个需要时间和空间。我从报价中得到了问题,并提出了这两种方法,但是我不知道该选择哪种方法。我只需要说明问题的空间复杂性。n22n22\frac{n^2}{2}lognlog⁡n\log n 我感到困惑的原因 我倾向于说第二个是最好的选择,因为它在时间上比较好,但是答案仅来自我很幸运并想出一种算法。看起来,如果我想给某些东西添加空间复杂性,那么不需要运气就可以得出正确的算法。我想念什么吗?我是否应该甚至提出解决问题的方法来解决空间的复杂性?

1
用两个递归调用解决递归关系
我正在研究quicksort的最坏情况下的运行时,条件是它不会为very的各种定义进行非常不平衡的分区。 为了做到这一点,我问自己一个问题如果快速排序总是发生在分区的情况下那么运行时间将是什么,使得元素在左分区中,而在右分区中(在中间保留元素,即枢轴)。T(n,p)T(n,p)T(n, p)0&lt;p≤120&lt;p≤120 < p \leq {1\over 2}⌊p(n−1)⌋⌊p(n−1)⌋\lfloor{p(n-1)}\rfloor⌈(1−p)(n−1)⌉⌈(1−p)(n−1)⌉\lceil(1 - p)(n - 1)\rceil111 不难看出,为最坏的情况给出了上限,在最坏的情况下,是允许的最大不平衡分区,因为任何分数分区都将更加平衡,运行时更短,并且不允许任何分数。T(n,p)T(n,p)T(n, p)ppp&gt;p&gt;p> p&lt;p&lt;p<p 很明显,在快速排序中是最好的情况,而是最差的情况。两者都具有在任何教育资源中都能找到的容易复发的关系。但是我不知道一般如何学习。明显的关系是:T(n,12)T(n,12)T(n, {1 \over 2})T(n,0)T(n,0)T(n, 0)T(n,p)T(n,p)T(n, p) T(n,p)=n+T(⌊p(n−1)⌋,p)+T(⌈(1−p)(n−1)⌉,p)T(n,p)=n+T(⌊p(n−1)⌋,p)+T(⌈(1−p)(n−1)⌉,p)T(n, p) = n + T(\lfloor{p(n-1)}\rfloor, p) + T(\lceil(1 - p)(n - 1)\rceil, p) 在这里我被卡住了。我尝试过搜索,但是我能理解的有关分而治之算法的所有文献都按字面意义进行了“除法”,并利用分区总是相等的事实“欺骗”了分析,将术语合并为一个不变。 我不知道如何处理两个递归调用,也不知道删除舍入是否安全。这可以解析地解决吗?如果可以,怎么解决? PS:我对渐近不感兴趣(对于任何常数,它很容易显示)。我对随着变小而使quicksort变慢多少感兴趣,例如,我对的比率感兴趣。p p T (n ,0.25 )Θ(nlogn)Θ(nlog⁡n)\Theta(n \log n)ppppppT(n,0.25)T(n,0.5)T(n,0.25)T(n,0.5)T(n, 0.25) \over T(n, 0.5) PPS:作为一名本科生,如果我发现明显的事情过于冗长或无法解释的琐事,我深表歉意。而且,尽管我不知道是否像其他SE网站一样受到人们的关注,但我会注意到这是个人兴趣,而不是作业。

1
为什么在
我的教科书说:“我们将函数定义如下:和。请注意,给定,我们可以在时间中轻松找到数量,使得夹在和。” f (1 )= 2 f (i + 1 )= 2 f (i )1.2 n O (n 1.5)i n f (i )f (i + 1 )F:N → Nf:N→Nf\colon \mathbb{N}\to\mathbb{N}F(1 )= 2f(1)=2f(1)=2F(我+ 1 )= 2F(我)1.2f(i+1)=2f(i)1.2f(i+1)=2^{f(i)^{1.2}}ñnnØ (ñ1.5)O(n1.5)O(n^{1.5})一世iiñnnF(我)f(i)f(i)F(我+ 1 )f(i+1)f(i+1) 我如何使自己相信我们实际上可以在时间内轻松找到?由于是递归定义的,我认为我们必须计算直到。为了找出这些计算所花费的时间,我认为我们必须为依赖于找到合适的上限,并且必须找到函数。最后,我们可以希望显示所引用的命题。不幸的是,我看不到一件事,也看不到另一件事。ø (Ñ 1.5)˚F ˚F (1 ),˚F (2 ),˚F (3 )... ˚F (Ĵ )˚F …

1
为什么说广度优先搜索在时间?
经常有人说(例如,在Wikipedia中),图上的广度优先搜索(BFS)的运行时间为。但是,任何连接图都具有,即使在非连接图中,BFS也永远不会查看包含起始顶点的组件外部的顶点。该组件最多包含 边,所以它最多包含个顶点,这些是该算法将访问的唯一顶点。G=(V,E)G=(V,E)G=(V,E)O(|V|+|E|)O(|V|+|E|)O(|V|+|E|)|V|≤|E|+1|V|≤|E|+1|V|\leq |E|+1|E||E||E||E|+1|E|+1|E|+1 这意味着,那么为什么不说运行时间仅为呢?|V|+|E|≤2|E|+1|V|+|E|≤2|E|+1|V|+|E|\leq 2|E|+1O(|E|)O(|E|)O(|E|) 这是关于Disjkstra算法运行时间的一个问题的评论。

1
如何最大限度地
我看到了很多算法问题,这些问题总是导致以下问题: 你有一个整数数组h[1..n]≥0H[1 ..ñ]≥0h[1..n]\geq 0,则需要找到i,j一世,Ĵi,j这样最大化(h[j]−h[i])(j−i)(H[Ĵ]-H[一世])(Ĵ-一世)(h[j]-h[i])(j-i)中O(n)Ø(ñ)O(n)时间。 显然,O(n2)Ø(ñ2)O(n^2)时间解决方案是考虑所有对,但是,有什么方法可以使的表达式最大化,O(n)Ø(ñ)O(n)而又不了解性质hHh吗? 我想到了一个想法是修复jĴj,那么我们需要找到i∗一世∗i^*从11个1到j−1Ĵ-1个j-1等于argmaxi{(h[j]−h[i])(j−i)}argmax一世{(H[Ĵ]-H[一世])(Ĵ-一世)}\text{argmax}_i\{(h[j]-h[i])(j-i)\}或argmaxi{h[j]j−h[j]i−h[i]j+h[i]i}argmax一世{H[Ĵ]Ĵ-H[Ĵ]一世-H[一世]Ĵ+H[一世]一世}\text{argmax}_i\{h[j]j-h[j]i-h[i]j+h[i]i\},由于jĴj是固定的,因此我们需要argmaxi{−h[j]i−jh[i]+ih[i]}argmax一世{-H[Ĵ]一世-ĴH[一世]+一世H[一世]}\text{argmax}_i\{-h[j]i-jh[i]+ih[i]\}。 但是,我看不出要摆脱内部jĴj依赖项的方法。有什么帮助吗?

1
随机可熔堆-预期高度
随机可熔堆具有一个“混合”操作,然后我们将其用于定义所有其他操作,包括插入。 问题是,具有节点的那棵树的期望高度是多少?nnn Gambin和Malinkowski的定理1,随机可融合优先级队列(SOFSEM论文集,计算机科学讲座,第1521卷,第344-349页,1998;PDF)给出了该问题的答案。但是,我不明白为什么可以这样写: E[hQ]=12((1+E[hQL])+(1+E[hQR])).E[hQ]=12((1+E[hQL])+(1+E[hQR])).\mathbb{E} [ h_Q] = \frac{1}{2} ((1 + \mathbb{E}[h_{Q_L}]) + (1 + \mathbb{E}[h_{Q_R}]))\,. 对我来说,树的高度是 hQ=1+max{hQL,hQR},hQ=1+max{hQL,hQR},h_Q = 1 + \max\, \{ h_{Q_L}, h_{Q_R}\}\,, 我可以扩展为: E[hQ]=1+E[max{hQL,hQR}]=1+∑kP[max{hQL,hQR}=k].E[hQ]=1+E[max{hQL,hQR}]=1+∑kP[max{hQL,hQR}=k].\mathbb{E} [ h_Q] = 1 + \mathbb{E}[\max \,\{ h_{Q_L}, h_{Q_R}\}] = 1 + \sum k \mathbb{P}[\max\, \{ h_{Q_L}, h_{Q_R}\} = k]\,. 可以使用总概率定律重写两个子树的高度的最大值等于kkk的概率: P[max{hQL,hQR}=k]=P[max{hQL,hQR}=k∣hQL≤hQR]P[hQL≤hQR]+P[max{hQL,hQR}=k∣hQL&gt;hQR]P[hQL&gt;hQR]=P[hQR=k∣hQL≤hQR]P[hQL≤hQR]+P[hQL=k∣hQL&gt;hQR]P[hQL&gt;hQR].P[max{hQL,hQR}=k]=P[max{hQL,hQR}=k∣hQL≤hQR]P[hQL≤hQR]+P[max{hQL,hQR}=k∣hQL&gt;hQR]P[hQL&gt;hQR]=P[hQR=k∣hQL≤hQR]P[hQL≤hQR]+P[hQL=k∣hQL&gt;hQR]P[hQL&gt;hQR].\begin{align*} \hspace{2em}&\hspace{-2em} \mathbb{P}[\max\, …

1
为什么内省型使用堆排序而不是合并排序?
作为涉及内省排序实现的家庭作业的一部分,我被问到为什么使用堆排序而不是合并排序(或其他算法)。 Ø (ñ 日志(n ))Ø(ñ日志⁡(ñ))O(n\log(n)) Introsort是一种混合排序算法,可提供快速平均性能和(渐近)最佳最坏情况性能。它从快速排序开始,并在递归深度超过基于排序元素数量(的对数)的级别时切换到堆排序。(Wikipedia,检索2014年5月6日。) 我能想到的唯一原因是,heapsort是“就位”的……但是,我并不真正理解为什么这在这里很重要。

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.