计算机科学

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

4
使用抽水引理证明语言不规则
我正在尝试使用抽运引理来证明是不规则的。L={(01)m2m∣m≥0}L={(01)m2m∣m≥0}L = \{(01)^m 2^m \mid m \ge0\} 到目前为止,这就是我的假设:假设是规则的,令为泵浦长度,所以。考虑任何抽运分解使得 和。LLLpppw=(01)p2pw=(01)p2pw = (01)^p 2^pw=xyzw=xyzw = xyz|y|>0|y|>0|y| >0|xy|≤p|xy|≤p|xy| \le p 我不确定下一步该怎么做。 我在正确的轨道上吗?还是我要离开?

1
分布式alpha beta修剪
我正在寻找一种有效的算法,该算法可让我在分布式体系结构上使用alpha-beta修剪来处理国际象棋的minimax搜索树。我发现的算法(PVS,YBWC,DTS见下文)都已经很老了(1990年是最新的)。我认为自那时以来已经有了许多实质性的进步。目前该领域的标准是什么? 另外,请指出白痴对DTS的解释,因为我从阅读的研究论文中无法理解它。 上面提到的算法: PVS:原则变化分裂 YBWC:青年兄弟等待概念 DTS:动态树拆分 全部都在这里讨论。

2
单亲图可以有多少条边?
单向图是有向图,因此从任何一个顶点到任何其他顶点最多只有一条简单路径。 单态图可以具有周期。例如,一个双向链接列表(不是循环列表!)是一个单感图。如果列表包含元素,则该图具有个长度为2的循环,总共。n - 1 2 (n - 1 )ñnnn − 1n−1n-12 (n − 1 )2(n−1)2(n-1) 具有个顶点的单态图的最大边数是多少?渐近边界将是可行的(例如或)。O (n )Θ (n 2)ñnnO (n )O(n)O(n)Θ (n2)Θ(n2)\Theta(n^2) 受到加权单态图中查找最短路径的启发; 在我的证明中,我最初想声称边的数量为但随后意识到限制循环数就足够了。O (n )O(n)O(n)


1
保存数组初始化
我最近读到,有可能不需要初始化数组,即可以使用它们而不必花费任何时间尝试将每个成员设置为默认值。即,您可以开始使用数组,就好像它已被默认值初始化一样,而不必初始化它。(对不起,我不记得我在哪里读到的)。 例如,为什么这可能令人惊讶: 假设您正在尝试为[ 1 ,n 2 ]范围内的整数的最坏情况O(1)O(1)\mathcal{O}(1)哈希表建模 (针对每个插入/删除/搜索)。[1,n2][1,n2][1, n^2] 您可以分配大小为位的数组,并使用各个位来表示哈希表中是否存在整数。注意:分配内存被视为O(1 )时间。n2n2n^2O(1)O(1)\mathcal{O}(1) 现在,如果您根本不必初始化此数组,则此哈希表上的任何说运算的序列现在都是最坏的情况O(n )。nnnO(n)O(n)\mathcal{O}(n) 因此,实际上,您有一个“完美的”哈希实现,对于操作序列,它使用Θ (n 2)空间,但运行时间为O(n )!nnnΘ(n2)Θ(n2)\Theta(n^2)O(n)O(n)\mathcal{O}(n) 通常,您会希望您的运行时至少与您的空间使用情况一样糟糕! 注意:上面的示例可能用于稀疏集或稀疏矩阵的实现,所以我想这不仅具有理论意义。 所以问题是: 如何有一个像数据结构这样的数组,使我们可以跳过初始化步骤?

3
光线跟踪与基于对象的渲染?
入门图形课程通常有一个项目,要求您构建光线跟踪器以渲染场景。许多进入研究生院的图形学生说,他们想从事射线追踪。然而,在SIGGRAPH等场所中,光线追踪似乎是一片死地。 光线跟踪是否真的是在所有所需照明等条件下准确渲染场景的最佳方法,是光线跟踪器的缓慢(读取非交互式)性能使它们变得不感兴趣,还是还有其他东西?
19 graphics 

1
决策问题,以至于任何算法都可以采用指数级更快的算法
在Hromkovič的《困难问题算法》(第二版)中,有一个定理(2.3.3.3,第117页): 存在一个(可确定的)决策问题这样,对于每个求解P的算法,都有另一个算法A'也会求解P,并且另外满足\ qquad \ forall ^ \ infty n \ in \ mathbb {N}。\ mathrm {时间} _ {A'}(n)= \ log_2 \ mathrm {时间} _A(n)PPPAAAPPPA′A′A'PPP ∀∞n∈N.TimeA′(n)=log2TimeA(n)∀∞n∈N.TimeA′(n)=log2⁡TimeA(n)\qquad \forall^\infty n \in \mathbb{N}. \mathrm{Time}_{A'}(n) = \log_2 \mathrm{Time}_A(n) TimeA(n)TimeA(n)\mathrm{Time}_A(n)是在最坏的情况下运行时AAA大小的输入nnn和∀∞∀∞\forall^\infty “为所有,但有限多个”的意思。 没有给出证明,我们也不知道如何去做。实际上,这很违反直觉。定理如何证明?

3
用什么直观的方式来解释和理解德摩根定律?
戴摩根定律经常在计算机科学课程的入门数学中引入,我经常将其视为通过否定术语将陈述从AND变为OR的一种方式。 是否有更直观的解释说明为什么这样做有效,而不仅仅是记住真值表?对我来说,这就像使用黑魔法,有什么更好的方法来解释这一点,从而使数学上不太偏爱的人有意义?

3
类型'a->'b的ML函数
我们的教授要求我们考虑OCaml中具有以下类型的函数 'a -> 'b 即,一个参数的函数可以是任何东西,并且可以返回不同的任何东西。 我想到了raise在忽略其参数的函数中使用: let f x = raise Exit 但是这位教授说,有一种解决方案不需要标准库中的任何功能。我很困惑:'b如果一开始就没有一个,怎么办? 我在这里而不是在Stack Overflow上问是因为我想了解发生了什么,我不想只看一个没有解释的程序。

4
不了解TCS的策略
我是一名正在学习计算理论课程的研究生,一旦被要求,我在制作内容方面存在严重的困难。我能够按照教科书(Michael Sipser的计算理论简介)和讲座进行学习;但是,当被要求证明某件事或提出特定TM的正式描述时,我只是cho之以鼻。 在这种情况下我该怎么办?我想我的问题是完全理解抽象概念,以至于我可以实际使用它们。是否有一种结构化的方法来处理新的抽象概念并最终建立直觉?

1
轻松从3SAT简化为哈密顿路径问题
Sipser的书“计算理论简介”在第286页中从3SAT到汉密尔顿路径问题有所减少。 有更简单的减少方法吗? 简单来说,我的意思是减少(对于学生而言)更容易理解。 有没有使用线性变量的减少量? Sipser的减少使用变量,其中是从句的数量,是变量的数量。换句话说,可能的是减少从尺寸吹到。有一个简单的约简,其中约简的输出大小与它的输入大小成线性关系吗?O(kn)O(kn)O(kn)kkknnnsssO(s2)O(s2)O(s^2) 如果不可能,是否有原因?这是否意味着复杂性/算法的未知结果?

2
类型检查算法
我正在开始有关类型检查算法的个人书目研究,并需要一些技巧。最常用的类型检查算法,策略和通用技术是什么? 我对以众所周知的强静态类型化语言(例如C ++,Java 5 +,Scala或其他语言)实现的复杂类型检查算法特别感兴趣。IE,由于基础语言的键入非常简单(例如Java 1.4及更低版本),因此类型检查算法不是很简单。 我本身对特定的语言X,Y或Z并不感兴趣。我对类型检查算法感兴趣,无论它们针对的是哪种语言。如果您提供诸如“您从未听说过的语言L是强类型且类型复杂的答案”,则可以使用类型检查算法,该算法通过使用算法Z检查X和Y来进行A,B和C运算,或者“用于Scala的策略X和Y以及用于C#的A的变体Z都很酷,因为R,S和T功能以这种方式起作用”,那么答案就很好。

4
合作调度在执行I / O操作时是否会挂起进程?
许多操作系统参考都说,在协作式(而不是抢占式)多任务处理中,进程将保持CPU直到它明确地自愿挂起自身。如果正在运行的进程执行了无法立即满足的I / O请求(例如,请求尚不可用的击键),那么调度程序是否将其挂起,或者它确实保留了CPU,直到可以为该请求提供服务为止? [进行了编辑,以“执行无法立即满足的I / O请求”替换“ I / O上的块”。]

5
动态编程的案例区分:需要示例!
我从事动态编程已有一段时间了。评估动态编程递归的规范方法是创建一个包含所有必要值的表,并将其逐行填充。有关简介,请参见例如Cormen,Leiserson等人:“算法简介”。 我将重点放在二维(逐行填充)的基于表的计算方案上,并研究单元格依存关系的结构,即在计算另一个单元格之前需要完成哪些单元格。我们用表示Γ(i)Γ(i)\Gamma(\mathbf{i})单元格ii\mathbf{i}依赖的单元格的索引集。请注意,ΓΓ\Gamma必须是无周期的。 我从计算出的实际函数中抽象出来,并专注于其递归结构。形式上,如果递归具有以下形式,则我认为它ddd是动态编程 d(i)=f(i,Γ˜d(i))d(i)=f(i,Γ~d(i))\qquad d(\mathbf{i}) = f(\mathbf{i}, \widetilde{\Gamma}_d(\mathbf{i})) 与,〜Γ d(我)= { (Ĵ,d (Ĵ))| Ĵ ∈ Γ d(我)}和˚F一些(可计算)函数,它不使用ð比通过其他〜Γ d。i∈[0…m]×[0…n]i∈[0…m]×[0…n]\mathbf{i} \in [0\dots m] \times [0\dots n]Γ˜d(i)={(j,d(j))∣j∈Γd(i)}Γ~d(i)={(j,d(j))∣j∈Γd(i)}\widetilde{\Gamma}_d(\mathbf{i}) = \{(\mathbf{j},d(\mathbf{j})) \mid \mathbf{j} \in \Gamma_d(\mathbf{i}) \}fffdddΓ˜dΓ~d\widetilde{\Gamma}_d 当限制的粒度粗糙区域(左侧,左上,上,右上,...当前单元格)的一个观察到有三个基本例(高达对称性和旋转)的有效动态编程递归,通知如何填充表:ΓdΓd\Gamma_d 红色区域表示(近似)。情况一和二承认子集,情况三是最坏的情况(直到索引转换)。注意,并非严格要求整个红色区域都被Γ覆盖;表格每个红色部分中的一些单元格足以将其涂成红色。明确要求白色区域不包含任何必需的单元格。ΓΓ\GammaΓΓ\Gamma 第一种情况的示例是编辑距离和最长公共子序列,第二种情况适用于Bellman&Ford和CYK。不太明显的例子包括:对角线而不是行(或列),因为它们可以旋转以适应所提出的情况;有关示例,请参见乔的答案。 不过,对于情况三,我没有(自然的)例子!所以我的问题是:案例三的动态编程递归/问题有哪些示例?

2
“差异”操作是否为已经包含“联接”的查询语言增加了表达能力?
集差运算符(例如,EXCEPT在某些SQL变体中)是关系代数的许多基本运算符之一。但是,有些数据库不直接支持集合差异运算符,而是支持LEFT JOIN(一种外部联接),实际上,可以使用它代替集合差异运算来达到相同的效果。 这是否意味着即使没有设置差异运算符,只要LEFT JOIN保持该运算符,查询语言的表达能力也是相同的?一个人怎么证明这一事实呢?

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.