计算机科学

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

4
如何在有限状态自动机中模拟后向引用,超前查找和向后查找?
此问题是从Stack Overflow 迁移而来的,因为可以在Computer Science Stack Exchange上回答。 迁移 7年前。 我创建了一个简单的正则表达式词法分析器和解析器,以获取一个正则表达式并生成其解析树。对于基本的正则表达式,从此解析树创建非确定性有限状态自动机相对简单。但是,我似乎无法全神贯注于如何模拟反向引用,先行和后备。 从我在紫色龙书中读到的内容中,我了解到,要模拟一个先行,当且仅当匹配项后跟正则表达式匹配项时,才匹配正则表达式,您将创建一个不确定的有限元状态自动机,其中替换为。是否可以创建相同的确定性有限状态自动机?r s / εr /秒r/sr/s[Rrrsss///εε\varepsilon 模拟否定的前瞻性和后瞻性怎么样?如果您将我链接到描述如何详细执行此操作的资源,我将不胜感激。

1
字符串中最长的重复(分散)子序列
非正式问题陈述: 给定一个字符串(例如,我们希望将一些字母成红色,将一些字母成蓝色(有些根本不),这样,从左到右仅读取红色字母会产生与仅读取蓝色字母相同的结果。ACCABBABACCABBABACCABBAB 在示例中,我们可以为它们着色:ACCABBABACCABBABA\color{blue}{C}\color{red}{CAB}B\color{blue}{AB} 因此,我们说是的重复子。它也是最长的重复子序列(易于检查)。A C C A B B A BCABCABCABACCABBABACCABBABACCABBAB 我们可以有效地计算最长的重复子序列吗? 正式问题: 确定字符串和某个是否难为NP,字符串中是否存在长度为的重复子序列?ķkkkkkk 如果是这样:哪个问题可以减少到这个问题? 如果不是:什么是有效算法?(显然,此算法可用于计算最长的重复子序列) 奖励问题: 如果字母的大小受常数限制,它们将始终是长度为的重复子序列吗?n/2−o(n)n/2−o(n)n/2 - o(n) (这对于二进制字母来说是正确的。) 编辑2:对于奖金问题的否定答案,众所周知的是大小至少为字母。实际上,对于大小为Σ的字母,存在具有最长重复子序列且长度仅为O(n·Σ^ {-1/2})的字符串。随机字符串足以证明这一点。结果已经存在,但我忽略了它。555ΣΣΣO(n⋅Σ−1/2)O(n·Σ−1/2)O(n · Σ^{-1/2}) 编辑: 注意: 有些人说“子序列”时,其意思是“子串”。我不。这不是找到子字符串两次的问题。

3
可视化编程工具,为什么不直接与AST一起使用?
我已经找到了一些开源的可视化编程工具,例如Blockly和friends,以及在Github托管的其他项目,但是找不到直接与抽象语法树配合使用的工具。 这是为什么? 我之所以问是因为,一旦我发现那里的每个编译器在编译过程中都有一个阶段,它将源代码解析为AST,对我来说很明显,某些可视化编程工具可以利用这一点为程序员提供方法直接以视觉方式编辑AST,还可以进行从源到节点图的往返,然后在需要时再次返回源。 例如,人们可能认为,从JavaScript AST Visualizer到实际的JavaSript可视化编程工具,两者之间并没有太大的区别。 那么,我想念什么?

2
具有在摊销时间内搜索,插入和删除的数据结构
是否有数据结构可维护在摊销时间内支持以下操作的有序列表?O(1)Ø(1个)O(1) GetElement(k):返回列表的第个元素。kķk InsertAfter(x,y):将新元素y插入x后面的列表中。 Delete(x):从列表中删除x。 对于最后两个操作,您可以假定x是直接作为指向数据结构的指针而给出的。InsertElement返回y的相应指针。InsertAfter(NULL,y)在列表的开头插入y。 例如,从一个空的数据结构开始,以下操作将更新有序列表,如下所示: InsertAfter(NULL,a) ⟹⟹\implies [一种] InsertAfter(NULL,b) ⟹⟹\implies [b,a] InsertAfter(b,c) ⟹⟹\implies [b,c,a] InsertAfter(a,d) ⟹⟹\implies [b,c,a,d] 删除(c) ⟹⟹\implies [b,a,d] 在这五个更新之后,GetElement(2)应该返回d,而GetElement(3)应该返回一个错误。


4
暂停问题的不确定性证明
我无法理解暂停问题无法确定的证据。 如果返回是否该程序输入暂停,为什么我们要通过的代码两个和?a b P a bH(a ,b )H(一种,b)H(a,b)一种一种abbbPPP一种一种abbb 为什么我们不能用和任意输入给?H()H()H()PPPXXx


6
为什么不使用可逆闸门?
我读过库兹韦尔(Kurzweil)写的《奇点就近》这本书,他提到了可逆门,例如弗雷德金门。使用此类门的优势在于,我们可以消除与计算有关的热浪费,因为这些计算只是比特消失了,而计算不需要任何能量输入。这些假设使这些门听起来像是一个奇迹解决方案。因此,问题在于哪些技术障碍仍在阻止其大规模使用。 我还认为我从未听说过德国顶级大学的电气工程学士和硕士课程中的这些闸门真是可耻...

2
SAT求解器的n分之一编码
我正在使用SAT解算器对问题进行编码,作为SAT实例的一部分,我具有布尔变量,其中这些变量中的一个应该为true,其余的应该为false 。(我有时将其描述为“一次性”编码。)X1个,X2,… ,xñx1,x2,…,xnx_1,x_2,\dots,x_n 我想在SAT中编码约束“一个必须为true”。编码此约束以使SAT求解器尽可能高效运行的最佳方法是什么?X1个,… ,xñx1,…,xnx_1,\dots,x_n 我可以看到许多方法来编码此约束: 成对约束。我可以为所有添加成对约束以确保至多一个为true,然后添加以确保至少一个为true 。我,Ĵ X 我X 1 ∨ X 2 ∨ ⋯ ∨ X Ѭ X一世∨ ¬ XĴ¬xi∨¬xj\neg x_i \lor \neg x_j我,Ĵi,ji,jX一世xix_iX1个∨ X2∨ ⋯ ∨ Xñx1∨x2∨⋯∨xnx_1 \lor x_2 \lor \cdots \lor x_n 这将添加子句,并且没有额外的布尔变量。Θ (n2)Θ(n2)\Theta(n^2) 二进制编码。 我可以引入新的布尔变量来表示(以二进制形式)一个整数,使得(添加一些布尔约束以确保在所需范围内)。然后,我可以添加一些约束来强制是tree,而所有其他都是false。换句话说,对于每个,我们添加强制执行子句。我1,我2,... ,我LG的Ñ我1 ≤ 我≤ Ñ 我X 我X Ĵ Ĵ 我= Ĵ …

5
有防布隆过滤器吗?
一个布隆过滤器能够有效地跟踪是否处理过程中已经遇到的各种值。当有许多数据项时,布隆过滤器可以节省散列表上的大量内存。与哈希表共享的Bloom筛选器的主要功能是,如果某项不是新项,则始终显示“ not new”,但将项标记为“ not new”的可能性不为零。即使是新的。 是否有行为相反的“抗布鲁姆过滤器”? 换句话说:是否存在一个有效的数据结构,如果某项是新项,它会显示“ new”,但对于某些非新项也可能会显示“ new”? 保留所有先前看到的项(例如,在排序的链表中)可以满足第一个要求,但可能会占用大量内存。考虑到第二个要求放宽,我希望这也是不必要的。 对于那些更喜欢正式对待的人,如果Bloom过滤器认为是新的,则写,否则,写,如果确实是新的,写,而否则。b (x )= 1b(x)=1b(x) = 1Xxxb (x )= 0b(x)=0b(x) = 0n (x )= 1n(x)=1n(x) = 1Xxxn (x )= 0n(x)=0n(x) = 0 然后 ; ; ; ,对于某些。Pr [ b (x )= 0 | n (x )= 0 ] = 1Pr[b(x)=0|n(x)=0]=1Pr[b(x) = …

3
NP完整性教学-Turing减少vs Karp减少
我对如何最好地向计算机科学专业的学生教授NP完整性的问题感兴趣。特别是,我们应该使用Karp缩减还是Turing缩减来教授它? 我觉得NP完全性和约简的概念是每个计算机科学专业都应该学习的东西。但是,在教授NP完整性时,我注意到使用Karp约简法有一些缺点。 首先,对某些学生来说,减少Karp似乎不必要地令人困惑。减少的直观概念是“如果我有解决问题X的算法,那么我也可以使用它来解决问题Y”。这是非常直观的-但映射到Turing缩减比映射Karp缩减要好得多。结果,我看到试图证明NP完整性的学生因直觉而误入歧途,并形成了错误的证明。尝试教授这两种简化方法并强调Karp简化方法的这一方面有时会感觉有点像是不必要的形式主义,并且会占用不必要的课堂时间和学生的注意力,这似乎是无关紧要的技术细节;我们为什么要使用这种更严格的还原概念,这并不是不言而喻的。 我确实了解Karp缩减和Turing(Cook)缩减之间的区别,以及它们如何导致NP完整性的不同概念。我意识到,减少Karp可以使我们更好地区分复杂度等级之间的区别。因此,对于认真研究复杂性理论,减少Karp显然是正确的工具。但是对于仅学习此方法并且永远不会进入复杂性理论的计算机科学专业的学生来说,我不确定这种更好的区分是否对他们至关重要至关重要。 最后,作为一名学生,我记得遇到“重言式”之类的问题时感到困惑-例如,给定一个布尔公式,检查它是否是重言式。令人困惑的是,这个问题显然很难解决:任何多项式时间算法都意味着P=NPP=NPP=NP; 解决这个问题显然和解决重言式问题一样困难。但是,即使从直觉上讲重言式和可满足性一样难,重言式也不是NP难的。是的,我今天了解为什么会这样,但当时我记得对此感到困惑。(一旦我终于明白了,我的脑海便是:无论如何,我们为什么要区分NP-hard和co-NP-hard?这似乎是人为的,并且在实践中没有很好的动机。为什么我们专注于NP而不是从实际的角度来看,共NP硬度似乎与NP硬度在本质上具有相同的实际结果,所以为什么我们都对这种区别挂了钩?是的,我知道答案,但是作为一名学生,我记得这只是让这个科目变得更加神秘和缺乏动力。) 所以,我的问题是这个。当我们向学生教授NP完全性时,使用Karp归约法或Turing归约法更好吗?有没有人尝试使用图灵归约法来教授NP完全性的概念?如果是这样,情况如何?如果我们使用图灵归约法讲授概念,而跳过与Karp归约法相关的概念性问题,会有任何明显的陷阱或弊端吗? 相关:请参见此处和此处,其中提到我们在文献中使用Karp归约法的原因是因为它使我们能够区分NP硬度和共NP硬度。但是,似乎没有给出任何针对该能力是否对每个CS专业都应该学习的算法课程的学习目标至关重要的教学观点的答案。另请参见cstheory.SE上的此处,该讨论也有类似的讨论。



3
找到无向图的最小割
这是我正在尝试解决的以往考试中的一个问题: 对于无向图 与正权w ^ (ē )≥ 0,我试图找到最小割。除了使用最大流最小割定理,我不知道其他方法。但是该图是无向的,那么我应该如何对其进行定向?我曾想过要在两端指向边缘,但是哪个顶点将成为源,哪个顶点将成为宿?还是有另一种方法来找到最小切割?GGG瓦特(É )≥ 0w(Ë)≥0w(e) \geq 0


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.