计算机科学

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

2
上下文无关的语法中可以有“死态”吗?
上下文无关的语法可以包含自动机的“死态”吗? G = ( { a ,b ,c } ,{ A ,B ,C} ,{ A → a B ,B → b ,B → C,C→ c C} ,A )?G=({一种,b,C},{一种,乙,C},{一种→一种乙,乙→b,乙→C,C→CC},一种)?G = \big(\{a, b, c\}, \{A, B, C\}, \{A\to aB, B\to b, B\to C, C\to cC\}, A\big)\,? 生产规则和C → c C将永远循环,并且永远不会生成单词。这是允许的还是必须在某些时候以终端结束生产规则?B → C乙→CB\to …

1
对一元字母进行反向引用的正则表达式
设置: 具有反向引用的正则表达式 一元语言(1个符号的字母) 在此设置中是否可以确定以下问题: 给定带有反向引用的正则表达式,它是否定义了正则语言? 例如,(aa+)\1定义一种常规语言,而(aa+)\1+没有。我们可以决定是哪种情况吗? 为了具体起见,“带有反向引用的正则表达式”在这里指的是例如与Perl兼容的常规正则表达式的以下子集: a匹配字符a(字母中唯一的字符) X* 匹配0个或多个出现 X X|Y比赛X或Y 括号可用于分组和捕获 \1。\2等匹配与第一对,第二对等括号相同的字符串 我们还可以使用常规的简写形式,例如X+= XX*。

3
为什么没有针对SAT和其他决策问题的近似算法?
我有一个NP完全决策问题。给定问题的一个实例,我想设计一种算法,如果问题可行,则输出YES,否则输出NO。(当然,如果算法不是最佳算法,则会出错。) 对于此类问题,我找不到任何近似算法。我一直在寻找SAT,并且在Wikipedia页面上有关近似算法的内容如下:该方法的另一个局限性是它仅适用于优化问题,而不适用于“纯粹”的决策问题,例如可满足性,尽管通常可以.. 。 例如,为什么我们不将近似率定义为与算法犯错的数量成正比呢?我们如何实际以贪婪和次优方式解决决策问题?

1
从属类型,细化类型和Hoare逻辑之间的区别
我几乎不了解依赖类型理论。来自维基百科: 从属类型是其定义取决于值的类型。 从我的类型理论课程中,我记得一个从属类型是: 由类型索引的类型族。 但是我对依赖类型,细化类型和hoare逻辑感到困惑。 因为从Depenedent VS细化类型来看,细化类型看起来像Hoare逻辑。除了仅允许陈述必须满足的陈述之外,还有哪些功率改进类型还提供什么(看起来与Hoare Logic几乎相同)? 相较于细化类型,从属类型还提供了哪些其他功能?并且从属类型比优化类型+ Sat / Constraint求解器更强大。 任何人都可以举例说明。

2
“最小”直觉型理论?
我为人们不断在类型理论中添加新类型感到惊讶,但似乎没有人提到一种最基本的理论(或者我找不到它)。我以为数学家喜欢极少的东西,不是吗? 如果我正确理解的话,在具有强制性的类型理论中Prop,λ-抽象和Π型就足够了。说够了,我的意思是它可以用作直觉逻辑。其他类型可以定义如下: ⊥ =dË ˚FΠ α :P[R Ø p 。α¬ 甲=dË ˚FA → ⊥甲∧ 乙=dË ˚FΠ ç:P[R Ø p 。(A → B → C)→ C甲∨ 乙=dË ˚FΠ ç:P[R Ø p 。(A → C)→ (B → C)→ C∃X :小号(P(x ))=dË ˚FΠ α :P[R Ø p 。(Π X :小号。Px → α )→ …

7
Lambda演算似乎并不抽象。我看不出重点
潜在的问题: 是什么演算为我们做,我们不能与基本功能属性和符号在中学代数一般学吗? 首先,抽象在lambda演算的上下文中是什么意思?我对“抽象”一词的理解与某种概念的概念概括-机器不同。 但是,lambda函数通过消除函数名称来防止某种程度的抽象。例如: f(x) = x + 2 h(x, y) = x + 5 y 但是,即使不定义这些功能的机制,我们也可以轻松地讨论它们的组成。例如: 1. h(x, y) . f(x) . f(x) . h(x, y) or 2. h . f . f . h 我们可以根据需要包含参数,也可以完全抽象以概述发生的情况。而且我们可以快速将它们简化为一个功能。让我们看一下构成2。我可以根据自己的重点来写一些学生的细节层次: g = h . f . f . h g(x, y) = h(x, …


7
一台没有RAM但有磁盘的计算机等同于有RAM的计算机吗?
据我了解,内存用于很多事情。它充当磁盘缓存,并包含程序的指令及其堆栈和堆。这是一个思想实验。如果人们不关心计算机处理数据的速度或时间,那么假设计算机的磁盘容量很大,那么它可以拥有的最小内存量是多少?可以只拥有一个磁盘就可以消除内存吗? 显然不需要磁盘缓存。如果我们在磁盘上设置交换空间,则程序堆栈和堆也不需要内存。是否有需要记忆的东西?

2
Mandelbrot集在什么意义上是“可计算的”?
该Mandelbrot集是在数学美丽的生物。 此设置有很多精美的高精度图像,因此在某种意义上显然该设置是“可计算的”。 但是,令我担心的事实是,它甚至无法递归枚举-仅因为该集合不可数。这可以通过要求点的某种有限表示来解决。 此外,尽管我们确定知道很多点属于该集合,而其他点不属于该集合,但是还有许多我们不知道其集合中的成员身份。到目前为止,我们所看到的所有图像都可能包含很多“绑定了n次迭代”的点,但是这些点实际上可能不属于该集合。 因此,对于具有有限表示形式的给定点,问题“此点是否属于集合?” 如果我是对的,还没有被证明是可以判定的。 现在,从什么意义上(通过哪种定义)我们可以说曼德尔布罗特集是“可计算的”?

4
“ Eugene Goostman”真的通过了图灵测试吗?
据说,“ Eugene Goostman”是一种计算机程序,用于模拟一个13岁的男孩,成功说服了33%的法官是人类,并因此通过了图灵测试。 这个计算机程序,又名聊天机器人,假装是一个13岁的乌克兰男孩,而英语是第二语言,这确实是非常不同的。 对我来说,尤金听起来完全像一个平庸的聊天机器人:重复,无意义,而且杂乱无章。我不知道它是如何说服法官的(这似乎不专业)。 很多人都批评尤金,例如史蒂文·哈纳德教授,他说“这是胡说八道”,“我们还没有通过图灵测试。我们甚至还没有接近。” 意见不一,但我真的想知道它是否正式通过了测试? 也有人说: 从未颁发过的两个一次性奖品。25K是为第一个聊天机器人提供的,该聊天机器人无法将法官与真实的人区分开,并且可以说服法官认为该人是计算机程序。100,000美元是对第一个聊天机器人的奖励,该聊天机器人在图灵测试中(包括解密和理解文本,视觉和听觉输入),无法与真实的人区分开。一旦实现,年度竞赛将结束。 这是否意味着Eugene赢得了$ 25,000?

4
定义非确定性自动机的停止问题
至少在我自己的参考教科书(Hopcroft + Ullman 1979)中,图灵机(TM)的主要定义是确定性的。 因此,我自己对停止问题的理解主要是确定性TM,尽管我知道可以将其用于其他类型的自动机。 我还注意到,确定性通常或多或少地隐含在人们经常提及TM或暂停问题的方式中。关于停止问题的维基百科页面就是一个很好的例子。 但是,似乎没有理由进行这种限制。给定自动机族 可能是不确定的,因此的暂停问题可以定义为:˚FFF\mathcal FFF\mathcal F 是否存在统一的决策过程,使得在给定自动机和输入,它可以决定是否在输入上停止计算。 X 一X一∈ ˚F一种∈FA\in\mathcal FxxxAAAxxx (这与说要用输入终止的计算并不完全相同。)XAAAxxx 确实,这似乎是使有关线性有界自动机(LBA)的暂停问题的讨论有意义的唯一方法,而线性有界自动机主要是非确定性自动机。 因此,我的问题是我是否正确,以及这种对不确定性自动机的暂停问题进行明显的第二类治疗的原因(和哪个原因)。

4
为什么随机化快速排序具有O(n log n)的最坏情况运行时间成本
随机快速排序是快速排序的扩展,其中随机选择枢轴元素。该算法在最坏情况下的时间复杂度是多少?据我说,它应该是Ø (ñ2)Ø(ñ2)O(n^2),因为最坏的情况是按排序顺序或反向排序顺序选择随机选择的枢轴。但是在某些文本[1] [2]中,最坏的情况是时间复杂度写为Ø (ñ 日志n)Ø(ñ日志⁡ñ)O(n\log{n}) 对不对

2
垂直能见度问题的高效算法
在思考一个问题时,我意识到我需要创建一种有效的算法来解决以下任务: 问题:我们给了nnn边的二维方盒,其边与轴平行。我们可以从顶部进行调查。但是,也有mmm水平段。每段具有的整数yyy -协调(0≤y≤n0≤y≤n0 \le y \le n)和xxx坐标- (0≤x1&lt;x2≤n0≤x1&lt;x2≤n0 \le x_1 < x_2 \le n)并连接点(x1,y)(x1,y)(x_1,y)和(x2,y)(x2,y)(x_2,y)(看下图)。 我们想知道,对于框顶部的每个单元段,如果我们仔细观察该段,可以在框内垂直看到多深。 x∈{0,…,n−1}x∈{0,…,n−1}x \in \{0,\dots,n-1\}maxi: [x,x+1]⊆[x1,i,x2,i]yimaxi: [x,x+1]⊆[x1,i,x2,i]yi\max_{i:\ [x,x+1]\subseteq[x_{1,i},x_{2,i}]} y_i 示例:给定和分段,如下图所示,结果为。看看有多深的光线可以进入盒子。米= 7 (5 ,5 ,5 ,3 ,8 ,3 ,7 ,8 ,7 )n=9n=9n=9m=7m=7m=7(5,5,5,3,8,3,7,8,7)(5,5,5,3,8,3,7,8,7)(5, 5, 5, 3, 8, 3, 7, 8, 7) 对我们来说幸运的是,和都非常小,我们可以离线进行计算。米nnnmmm 解决此问题的最简单算法是蛮力:对于每个段,遍历整个数组并在必要时进行更新。然而,它给我们不是很可观。O(mn)O(mn)O(mn) 很大的改进是使用了一个片段树,该树能够在查询过程中最大化片段上的值并读取最终值。我不会进一步描述它,但是我们看到时间复杂度是。O((m+n)logn)O((m+n)log⁡n)O((m+n) \log n) 但是,我想出了一个更快的算法: 大纲: 按坐标的降序对段进行排序(线性时间使用计数排序的变化)。现在注意,如果以前任何段都被任何段覆盖,则随后的任何段都不能再束缚通过该段的光束。然后,我们将从框的顶部到底部进行扫线。yyyxxxxxx …

3
测试语言是否无上下文的算法
是否有一种算法/系统程序来测试一种语言是否不受上下文限制? 换句话说,在给定的代数形式指定的语言(想到像),测试的语言是否是与否上下文无关。想象一下,我们正在编写一个Web服务,以帮助学生完成所有作业。您指定语言,Web服务将输出“无上下文”或“无上下文”。有没有什么好的方法可以自动执行此操作?L={anbnan:n∈N}L={anbnan:n∈N}L=\{a^n b^n a^n : n \in \mathbb{N}\} 当然,还有一些用于手动证明的技术,例如抽运引理,奥格登引理,帕里克引理,互换引理等等。但是,它们每个人都需要在某个时候进行手动洞察,因此尚不清楚如何将它们中的任何一种转化为算法。 我看到Kaveh在其他地方写过,非上下文无关的语言集不是可递归枚举的,因此似乎没有希望任何算法都能在所有可能的语言上运行。因此,我认为Web服务将需要能够输出“无上下文”,“非上下文”或“我无法分辨”。在教科书中很可能会看到的多种语言上,是否有除“我无法分辨”以外的其他算法通常能够提供答案?您将如何构建这样的Web服务? 为了使这个问题更好地解决,我们需要确定用户如何指定语言。我愿意接受建议,但我在想这样的事情: L={E:S}L={E:S}L = \{E : S\} 其中是一个单词表达式,S是一个在长度变量上的线性不等式的系统,具有以下定义:EEESSS 每个就是一个字表达。(这些代表可以容纳∑ ∗中任何单词的变量。)x,y,z,…x,y,z,…x,y,z,\dotsΣ∗Σ∗\Sigma^* 中的每一个都是单词表达。(示例性地,Σ = { a ,b ,c ,… },因此a ,b ,c ,…表示基础字母中的单个符号。)a,b,c,…a,b,c,…a,b,c,\dotsΣ={a,b,c,…}Σ={a,b,c,…}\Sigma=\{a,b,c,\dots\}a,b,c,…a,b,c,…a,b,c,\dots 每是一个字表达式中,如果η是一个长度可变。aη,bη,cη,…aη,bη,cη,…a^\eta,b^\eta,c^\eta,\dotsηη\eta 单词表达的串联是单词表达。 每个的是一个长度可变。(这些代表可以包含任何自然数的变量。)m,n,p,q,…m,n,p,q,…m,n,p,q,\dots 每个是长度可变的。(这些代表相应单词的长度。)|x|,|y|,|z|,…|x|,|y|,|z|,…|x|,|y|,|z|,\dots 这似乎足以处理我们在教科书练习中看到的许多情况。当然,如果愿意,您可以替换以代数形式指定语言的任何其他文本方法。

3
并行随机读取似乎效果很好–为什么?
考虑以下非常简单的计算机程序: for i = 1 to n: y[i] = x[p[i]] 这里和y是字节的n个元素数组,而p是字的n个元素数组。在这里,n很大,例如n = 2 31(这样,只有很小一部分的数据适合任何类型的高速缓存)。XXxÿÿyññnpppññnññnn = 231ñ=231n = 2^{31} 假设由随机数组成,在1和n之间均匀分布。ppp1个1个1ññn 从现代硬件的角度来看,这意味着: 读取很便宜(顺序读取)p [ i ]p[一世]p[i] 读取非常昂贵(随机读取;几乎所有读取都是高速缓存未命中;我们将不得不从主内存中获取每个单独的字节)x [ p [ i ] ]X[p[一世]]x[p[i]] 写很便宜(顺序写)。ÿ[ 我]ÿ[一世]y[i] 这确实是我所观察到的。与仅执行顺序读取和写入的程序相比,该程序非常慢。大。 现在出现一个问题:该程序在现代多核平台上的并行度如何? 我的假设是该程序不能很好地并行化。毕竟,瓶颈是主要内存。单核已经在浪费大部分时间,只是在等待主存储器中的某些数据。 但是,当我开始尝试瓶颈是这种操作的某些算法时,这并不是我观察到的! 我只是用OpenMP并行for循环替换了朴素的for循环(本质上,它将范围拆分为较小的部分,并在不同的CPU内核上并行运行这些部分)。[ 1,n ][1个,ñ][1,n] 在低端计算机上,加速确实很小。但是在高端平台上,我惊讶地发现我获得了出色的近线性加速。一些具体示例(确切的时间安排可能会有所偏离,会有很多随机变化;这些只是快速的实验): 2 x 4核Xeon(总共8核):与单线程版本相比,速度提高了5-8倍。 2 x 6核Xeon(总共12核):与单线程版本相比,速度提高了8-14倍。 现在,这完全出乎意料。问题: 究竟为什么这种程序并行化如此好?硬件会发生什么?(我目前的猜测是沿着这些思路的:从不同线程进行的随机读取是“流水线式的”,得到这些答案的平均速率比单线程情况要高得多。) 是否有必要使用多个线程和多个内核来获得任何加速?如果确实在主内存和CPU之间的接口中发生了某种流水线操作,那么单线程应用程序是否不能让主内存知道很快将需要, …

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.