Questions tagged «algorithm-analysis»

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

3
为什么不采用数值算法中数字的一元表示形式呢?
伪多项式时间算法是对输入值(幅度)具有多项式运行时间,而对输入大小(位数)具有指数运行时间的算法。 例如,测试数字是否为质数,需要循环从2到数字,并检查 mod是否为零。如果mod花费O(1)时间,则总时间复杂度将为O(n)。n - 1 n innnn−1n−1n-1nnn iii 但是,如果让为写入输入所需的位数,则(二进制),因此,问题的运行时间将是指数的O()。x = 日志n n = 2 x 2 xxxxx=lognx=log⁡nx = \log nn=2xn=2xn = 2^x2x2x2^x 我的问题是,如果我们考虑输入的一元表示形式,则始终为,则伪多项式时间将等于多项式时间复杂度。那么为什么我们从不这样做呢?x = nnnnx=nx=nx=n 此外,由于存在背包的伪多项式时间算法,因此通过取,背包将成为多项式,结果P = NPx=nx=nx=n


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 我感觉到,我们可以做得比二次。是否有针对此问题的更好算法?

1
气泡排序中的预期交换次数
给定一个由整数组成的数组,可以以一定的概率,将数组中的每个元素增加固定数量。我必须找到使用气泡排序对数组进行排序所需的交换次数。一种一种AññNbbbp [ i ]p[一世]p[i]0 ≤ 我&lt; Ñ0≤一世&lt;ñ0 \leq i < n 我尝试了以下方法: 一个元素的概率用于可以很容易地从给定的概率来计算。A [ i ] &gt; A [ j ]一种[一世]&gt;一种[Ĵ]A[i] > A[j]我&lt; j一世&lt;Ĵi < j 使用上述方法,我计算出了预期的交换次数为: double ans = 0.0; for ( int i = 0; i &lt; N-1; i++ ){ for ( int j = i+1; j &lt; …

1
随机选择
随机选择算法如下: 输入:一个数组,其中包含(为简单起见,是不同的)数字和一个Ñ ķ ∈ [ Ñ ]AAAnnnk∈[n]k∈[n]k\in [n] 输出:该“等级的元素”(即,一个在位置如果进行了排序)甲ķ 甲kkkAAAkkkAAA 方法: 如果有一个元素,则将其返回AAA 随机均匀地选择一个元素(“枢轴”)ppp 计算集合和- [R = { 一个∈ 甲:一&gt; p }L={a∈A:a&lt;p}L={a∈A:a&lt;p}L = \{a\in A : a < p\}R={a∈A:a&gt;p}R={a∈A:a&gt;p}R = \{a\in A : a > p\} 如果,返回的等级元素。ķ 大号|L|≥k|L|≥k|L| \ge kkkkLLL 否则,返回等级元素[Rk−|L|k−|L|k - |L|RRR 我被问到以下问题: 假设,那么您正在寻找中位数,并将 设为常数。在第一次递归调用中,包含中位数的集合的大小最大为的概率是多少?α &Element; (1 / 2 ,1 …

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) 所以: 这取决于算法? 什么意思以及何时使用每个输入长度“版本” 我可以使用一些规则来决定使用哪个规则吗?

2
三重嵌套循环的时间复杂度
请考虑以下三重嵌套循环: for (int i = 1; i &lt;= n; ++i) for (int j = i; j &lt;= n; ++j) for (int k = j; k &lt;= n; ++k) // statement 此处的语句正好执行n (n + 1 )(n + 2 )6n(n+1)(n+2)6n(n+1)(n+2)\over6次 有人可以解释一下该公式是如何获得的吗?谢谢。

3
说“渐近更有效”是什么意思?
当我们说算法渐近地比更有效时,这是什么意思?XXXÿÿY XXX对于所有输入,将是更好的选择。 XXX对于所有输入(小输入除外),都是更好的选择。 XXX对于大型输入以外的所有输入,都是更好的选择。 ÿÿY对于小输入,将是更好的选择。 这个问题的链接在这里。 http://quiz.geeksforgeeks.org/algorithms-analysis-of-algorithms-question-16/ 我以为,一种渐近有效的算法应该适用于所有输入,但是我没有明白“它适用于除小输入以外的所有输入”的原因。

3
加法的时间复杂度
维基百科将加法的时间复杂度列为,其中是位数。nñnnñn 这是严格的理论下限吗?还是这仅仅是当前最快的已知算法的复杂性。我想知道,因为加法的复杂性强调了所有其他算术运算和使用它们的所有算法。 从理论上讲不可能获得在中运行的加法算法?还是我们必须将线性复杂度相加。o(n)Ø(ñ)o(n)

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)

1
约束空间的选择算法?
有一种众所周知的最坏情况选择算法,可以找到整数数组中的第k个最大元素。它使用中位数中位数方法找到足够好的枢轴,将输入数组划分为适当的位置,然后递归继续搜索第k个最大元素。O (n )O(n)O(n) ķkkķkk 如果不允许我们触摸输入数组,那么要找到O (n )时间中的第个最大元素,需要多少额外空间呢?我们能否在O (1 )的额外空间中找到第k个最大元素,并且仍然保持运行时O (n )?例如,查找最大或最小元素需要O (n )时间和O (1 )空间。 ķkkO (n )O(n)O(n)ķkkO (1 )O(1)O(1)O (n )O(n)O(n)O (n )O(n)O(n)O (1 )O(1)O(1) 凭直觉,我无法想象我们可以做得比空间更好,但是有证据吗?O (n )O(n)O(n) 可有人点到基准或拿出一个说法,为什么 “个元素将需要Ø (ñ )空间中找到Ø (ñ )的时间?⌊ Ñ / 2 ⌋⌊n/2⌋\lfloor n/2 \rfloorO (n )O(n)O(n)O(n)O(n)O(n)

1
推断优化类型
在工作中,我的任务是推断一些有关动态语言的类型信息。我将语句序列重写为嵌套let表达式,如下所示: return x; Z =&gt; x var x; Z =&gt; let x = undefined in Z x = y; Z =&gt; let x = y in Z if x then T else F; Z =&gt; if x then { T; Z } else { F; Z } 由于我从一般类型信息开始,并试图推断出更具体的类型,因此自然的选择是精简类型。例如,条件运算符返回其真假分支类型的并集。在简单的情况下,它效果很好。 但是,在尝试推断以下类型时遇到了障碍: function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

1
修正的Borůvka算法的更严格分析
Borůvka算法是计算图的最小生成树的标准算法之一,。G=(V,E)G=(V,E)G = (V,E)|V|=n,|E|=m|V|=n,|E|=m|V| = n, |E| = m 伪代码为: MST T = empty tree Begin with each vertex as a component While number of components &gt; 1 For each component c let e = minimum edge out of component c if e is not in T add e to T …

1
通过随机分区进行集中选择?
在数字的数组中查找中值元素的常用简单算法是:AAAnnn 从采样元素并替换为n3/4n3/4n^{3/4}AAABBB 排序并找到排名元素和的BBB|B|±n−−√|B|±n|B|\pm \sqrt{n}lllrrrBBB 检查和在的中位数的相对侧,并且对于某些适当的常数在和与之间最多有元素。如果没有发生,则失败。lllrrrAAACn−−√CnC\sqrt{n}AAAlllrrrC&gt;0C&gt;0C > 0 否则,通过在和之间对的元素进行排序来找到中位数AAAlllrrr 不难看出这是线性运行的,并且成功的可能性很高。(所有不良事件与二项式的期望值相差很大。) 针对相同问题的另一种算法,这里描述的是一种更自然的方法,可以教给看过快速排序的学生:随机选择 还很容易看出,该循环的预期运行时间是线性的:说“回合”是一系列递归调用,当一个人进行1 / 4-3 / 4分割时结束,然后观察到一个回合最多为2。(在第一回合中,成功分割的概率为1/2,然后实际上增加了,因为描述了算法,所以回合长度受几何随机变量支配。) 所以现在的问题是: 是否有可能表明随机选择在线性时间内运行的可能性很高? 我们有回合,并且每个回合的长度至少为,概率最大为,因此并集约束得出运行时间为以概率。k 2 − k + 1 O (n log log n )1 − 1 / O (log n )O(logn)O(log⁡n)O(\log n)kkk2−k+12−k+12^{-k+1}O(nloglogn)O(nlog⁡log⁡n)O(n\log\log n)1−1/O(logn)1−1/O(log⁡n)1-1/O(\log n) 这有点令人不满意,但实际上是真的吗?

2
关于算法的好数学书[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我很喜欢数学的优雅和严谨,现在正在寻找有关算法和算法分析的文献。现在,涵盖什么算法对我来说并没有多大关系,但是如何呈现和对待它们就非常重要。¹我最看重一种非常清晰准确的语言,该语言以严格抽象的方式定义了所有使用的概念。 我发现由Cormen,Leiserson,Rivest和Stein撰写的经典算法简介非常整洁,但是对数学的处理不够好,并且其证明和定义非常非正式。在这方面,Sipser的《计算理论导论》似乎更好,但是仍然没有提供从数学到算法的无缝过渡。 谁能推荐一些东西? ¹:算法至少应使用经典的非平凡抽象数据结构(例如图形,数组,集合,列表,树等)来调用其所需数据的管理,最好也对此类数据结构进行操作。如果完全忽略数据结构的使用和管理问题,我不会太感兴趣。不过,我不太关心用它们解决的问题。

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.