计算机科学

为学生,研究人员和计算机科学从业者提供的问答

4
为什么左递归不好?
此问题是从理论计算机科学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换上回答。 迁移 6年前。 在编译器设计中,为什么应在语法中消除左递归?我正在读这是因为它可能导致无限递归,但是对于正确的递归语法来说,它也不是真的吗?

1
基于分区细化的算法比对数线性时间运行更快的问题
分区优化是一种从有限的对象集开始并逐步拆分对象集的技术。使用分区细化可以非常有效地解决某些问题(例如DFA最小化)。除了Wikipedia页面上列出的问题之外,我不知道通常可以使用分区优化来解决任何其他问题。在所有这些问题中,维基百科页面提到了两个基于线性分区优化的算法。有按字典顺序排序的拓扑排序[1]和按字典广度优先搜索的算法[2]。 是否还有其他示例或对可以使用分区细化有效解决的问题的引用,这在时间上比对数线性好? [1] Sethi,Ravi,“在两个处理器上调度图形”,SIAM计算杂志5(1):73-82,1976年。 [2] Rose,DJ,Tarjan,RE,Lueker,GS,“图上顶点消除的算法方面”,SIAM计算杂志5(2):266-283,1976。

1
使用主定理时对假设
Master定理是解决某些递归问题的漂亮工具。但是,在应用时,我们经常会掩盖一个不可或缺的部分。例如,在对Mergesort进行分析时,我们很高兴地从 T(n)=T(⌊n2⌋)+T(⌈n2⌉)+f(n)T(n)=T(⌊n2⌋)+T(⌈n2⌉)+f(n)\qquad T(n) = T\left(\left\lfloor \frac{n}{2} \right\rfloor\right) + T\left(\left\lceil \frac{n}{2} \right\rceil\right) + f(n) 至 T′(n)=2T′(n2)+f(n)T′(n)=2T′(n2)+f(n)\qquad T'(n) = 2 T'\left(\frac{n}{2}\right) + f(n) 仅考虑n=2kn=2kn=2^k。我们保证ourselved,这一步是有效的-那就是T∈Θ(T′)T∈Θ(T′)T \in \Theta(T') -因为TTT表现“很好”。通常,我们假设n=bkn=bkn=b^k对于bbb是公分母。 通过使用恶性,很容易构造不允许这种简化的重复fff。例如,以上针对T的重复TTT\,/T′T′\,T'与 f(n)={1n,n=2k,elsef(n)={1,n=2kn,else\qquad f(n) = \begin{cases} 1 &, n=2^k \\ n &, \text{else} \end{cases} 可以通过通常的方法使用Master定理得出Θ(n)Θ(n)\Theta(n),但是显然有一个子序列会像一样增长Θ(nlogn)Θ(nlog⁡n)\Theta(n \log n)。参见此处,了解另一个更人为的示例。 我们怎样才能做到“严谨”呢?我很确定单调性就足够了,但是即使简单的Mergesort递归也不是单调的。有一个周期分量(渐近地占主导)。研究是否足够fff,并且在fff有什么必要和充分条件来确保Master定理有效?

1
如果分割比率取决于则求解分治法
有没有一般的方法可以解决表格的重复性: T(n)=T(n−nc)+T(nc)+f(n)T(n)=T(n−nc)+T(nc)+f(n)T(n) = T(n-n^c) + T(n^c) + f(n) 对于或更普遍c&lt;1c&lt;1c < 1 T(n)=T(n−g(n))+T(r(n))+f(n)T(n)=T(n−g(n))+T(r(n))+f(n)T(n) = T(n-g(n)) + T(r(n)) + f(n) 其中是一些子线性函数。g(n),r(n)g(n),r(n)g(n),r(n)nnn 更新:我浏览了下面提供的链接,并筛选了Jeff Erickson笔记中的所有重复关系。这种复发形式在任何地方都没有讨论。Akkra-Bazi方法仅在分割为分数时适用。任何令人发指的参考文献将不胜感激。

2
更改递归关系中的变量
此问题是从理论计算机科学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 目前,我正在研究算法简介(CLRS),书中概述了一种解决递归关系的特定方法。 此示例可以说明以下方法。假设我们有复发 Ť(n )= 2 吨(n--√)+ 日志ñT(n)=2T(n)+log⁡nT(n) = 2T(\sqrt n) + \log n 最初,他们进行替换m = lg(n),然后将其重新插入递归并获得: Ť(2米)= 2 吨(2米2)+ 米T(2m)=2T(2m2)+mT(2^m) = 2T(2^{\frac{m}{2}}) + m 到目前为止,我完全理解。下一步是使我感到困惑的步骤。 他们现在“重命名”递归并令,这显然会产生S (m )= T (2 m)小号(米)S(m)S(m)小号(米)= T(2米)S(m)=T(2m)S(m) = T(2^m) 小号(m )= 2 秒(米/ 2 )+ 米S(m)=2S(m/2)+mS(m) = 2S(m/2) + m 出于某种原因,我不清楚这种重命名为何起作用,而且似乎只是作弊。谁能更好地解释这一点?


3
如何证明NFA中的DFA可以具有指数级的状态?
此问题是从理论计算机科学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 所有非确定性有限自动机都可以转化为等效的确定性有限自动机。但是,确定性有限自动机仅允许每个符号从状态指向一个箭头。因此,其状态应为NFA状态集的成员。这似乎表明,DFA的状态数可以根据NFA的状态数成指数增长。但是,我想知道如何实际证明这一点。



3
寻找离散对数有多难?
的离散对数是相同的发现在给出,Ç,和Ñ。a b = c mod N a c Nbbbab=cmodNab=cmodNa^b=c \bmod NaaacccNNN 我想知道这属于什么复杂度组(例如,对于经典计算机和量子计算机),以及哪种方法(即算法)最适合完成此任务。 上面的Wikipedia链接并没有给出非常具体的运行时。我希望找到最类似的方法来找到这种方法。

2
如何将并行复杂性结果缩小到不断增加的多个内核?
我在接受类NC给出的“通过并行算法有效解决”的复杂性理论视图时遇到了问题: NC是可以通过并行算法在具有处理器上的时间上通过并行算法解决的问题。p (Ñ )∈ ø (Ñ ķ)Ç ,ķ ∈ ÑO (对数Cn )O(logc⁡n)O(\log^cn)p (Ñ )∈ Ô (Ñķ)p(n)∈O(nk)p(n) \in O(n^k)Ç ,ķ ∈ Ñc,k∈Nc,k \in \mathbb{N} 我们可以假设一个PRAM。 我的问题是,这对于“真实”机器似乎没有多说,即具有有限数量处理器的机器。现在,我被告知“众所周知”,我们可以在处理器上“有效地”模拟处理器算法。p ∈ ÑØ (ñķ)O(nk)O(n^k)p ∈ Ñp∈Np \in \mathbb{N} “有效”在这里是什么意思?这是民间传说还是有严格的定理来量化模拟所引起的开销? 我担心发生的事情是我遇到了一个问题,该问题有一个顺序算法和一个“高效”并行算法,当在处理器上进行仿真时,也需要时间(如果顺序算法是渐近最优的,那么在这种粒度的分析上就可以预期到所有这些)。在这种情况下,据我们所知,并没有加速。实际上,模拟并行算法可能比顺序算法慢。那就是我真正在寻找比 bounds 更精确的声明(或声明没有这种结果的声明)。p O (n k)Ø (ñķ)O(nk)O(n^k)pppØ (ñķ)O(nk)O(n^k)ØOO

3
简单有限正则语言的抽取引理
维基百科对常规语言的抽水引理有以下定义... 令为常规语言。然后存在一个整数 ≥1仅取决于使得每个字符串在至少长度的(被称为“抽长度”)可被写为 = (即,可分为三个子字符串),满足以下条件:p L w L p p w x y z wLLLpppLLLwwwLLLppppppwwwxyzxyzxyzwww | | ≥1yyy | | ≤pxyxyxyppp 对于所有 ≥0, ∈X ÿ 我 ž 大号iiixyizxyizxy^izLLL 我看不到对于简单的有限规则语言是如何满足的。如果我有{字母表 }和正则表达式然后只包含一个字,其中接着。现在,我想看看我的普通语言是否满足抽水式引理。a b L a ba,ba,ba,babababLLLaaabbb 由于在我的正则表达式中没有任何重复,因此的值必须为空,以便对所有都满足条件3 。但是,如果是这样,则它会失败,条件1说长度必须至少为1!我ÿyyyiiiyyy 相反,如果我让为,或那么它将满足条件1但失败条件3,因为它实际上从未重复过。a b a byyyaaabbbababab 我显然很想念一些显而易见的东西。哪一个

2
如何描述算法,证明和分析算法?
在阅读计算机编程艺术(TAOCP)之前,我没有深入考虑这些问题。我将使用伪代码来描述算法,理解算法并仅估计增长顺序的运行时间。该TAOCP彻底改变了我的脑海里。 TAOCP使用英语加上步骤和goto来描述算法,并使用流程图更轻松地描绘算法。似乎是低级的,但是我发现有一些优点,尤其是流程图,我已经忽略了很多。我们可以在计算遍历该箭头时用关于当前事务状态的断言标记每个箭头,并为该算法提供归纳证明。作者说: 作者的争论是我们真正理解为什么只有当我们达到了我们的思想隐含地填充所有断言的程度时算法才是有效的方法,如图4所示。 我还没有经历过这样的东西。另一个优点是,我们可以计算每个步骤执行的次数。用基尔霍夫的第一定律很容易检查。我没有精确地分析运行时间,因此在估算运行时间时可能会省略一些。±1±1\pm1 分析增长顺序有时是无用的。例如,由于它们都是,因此我们无法区分quicksort和heapsort ,其中是期望的随机变量,因此我们应该分析常数,例如,和,因此我们可以比较和更好。而且,有时我们应该比较其他数量,例如方差。仅对运行时间的增长顺序进行粗略分析是不够的。作为TAOCPE(T(n))=Θ(nlogn)E(T(n))=Θ(nlog⁡n)E(T(n))=\Theta(n\log n)EXEXEXXXXE(T1(n))=A1nlgn+B1n+O(logn)E(T1(n))=A1nlg⁡n+B1n+O(log⁡n)E(T_1(n))=A_1n\lg n+B_1n+O(\log n)E(T2(n))=A2lgn+B2n+O(logn)E(T2(n))=A2lg⁡n+B2n+O(log⁡n)E(T_2(n))=A_2\lg n+B_2n+O(\log n)T1T1T_1T2T2T_2 将算法翻译成汇编语言并计算运行时间,这对我来说太难了,所以我想知道一些技术来更粗略地分析运行时间,这对于C,C ++等高级语言也很有用或伪代码。 我想知道研究工作中主要使用哪种描述风格,以及如何处理这些问题。

4
如何使用贪心算法找到最接近给定序列的非递减序列?
a1,…,ana1,…,ana_1, \ldots, a_n000lllaiaia_ibibib_i000lllbibib_ib i O (n 4max(|a1−b1|,…,|an−bn|)max(|a1−b1|,…,|an−bn|)\max(|a_1-b_1|, \ldots, |a_n-b_n|)bibib_iO(nl√4)O(nl4)O(n\sqrt[4]{l}) 老实说,我根本不知道如何开始解决这个问题。在我看来,这似乎是一个动态编程问题,但这位教授说,应该使用贪婪算法解决该问题。如果有人可以给我一点点提示就可以指出正确的方向,那将不胜感激。

3
可证明更快的随机算法在P中的问题
中是否存在任何问题,这些问题使随机算法超过了确定性算法的下限?更具体地讲,我们知道任何针对?这里表示由随机TM决定的语言集,在f(n)个步骤中具有恒定边界(一侧或两侧)错误。PP\mathsf{P}kkkP Ť 我中号È(˚F (Ñ ))˚F (Ñ )DTIME(nk)⊊PTIME(nk)DTIME(nk)⊊PTIME(nk)\mathsf{DTIME}(n^k) \subsetneq \mathsf{PTIME}(n^k)PTIME(f(n))PTIME(f(n))\mathsf{PTIME}(f(n))f(n)f(n)f(n) \ mathsf {P}内的随机性会给我们买任何东西PP\mathsf{P}吗? 明确地说,我正在寻找一种差异是渐近的(最好是多项式,但我会采用多元对数),而不仅仅是一个常数。 在最坏的情况下,我正在渐进地寻找算法。具有更高预期复杂度的算法不是我想要的。我指的是RP或BPP中的随机算法,而不是ZPP。

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.