计算机科学

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

4
显示X中的问题不是X完全的
实在的存在理论在PSPACE中,但我不知道它是否是 PSPACE-Complete。如果我认为并非如此,那我怎么证明呢? 更一般而言,给定某个复杂性类X中的问题,我如何证明它不是 X-Complete?例如,X可以是NP,PSPACE,EXPTIME。

4
Prolog可以解决约束满足问题吗?
是“晚会上”之类的问题可解的Prolog的?例如: Burdock Muldoon和Carlotta Pinkstone都说如果Albus Dumbledore来,他们会来的。阿不思·邓布利多(Albus Dumbledore)和黛西·多德里奇(Daisy Dodderidge)都表示,如果卡洛塔·平石(Carlotta Pinkstone)来,他们会来的。阿不思·邓布利多(Albus Dumbledore),牛d(Burdock Muldoon)和卡洛塔·平斯通(Carlotta Pinkstone)都说,如果埃尔弗里达·克拉格(Elfrida Clagg)来,他们会来的。卡洛塔·平斯通斯通(Carlotta Pinkstone)和黛西·多德里奇(Daisy Dodderidge)都说,如果法尔科·埃萨隆(Falco Aesalon)来,他们会来的。Burdock Muldoon,Elfrida Clagg和Falco Aesalon都说,如果Carlotta Pinkstone和Daisy Dodderidge都来,他们会来的。黛西·多德里奇(Daisy Dodderidge)表示,如果阿不思·邓布利多(Albus Dumbledore)和Burdock Muldoon都来,她会来的。需要说服谁参加聚会,以确保所有受邀者都参加? 我试图在GNU Prolog中表达这一点: attend(BM) :- attend(AD). attend(CP) :- attend(AD). attend(AD) :- attend(CP). attend(DD) :- attend(CP). attend(AD) :- attend(EC). attend(BM) :- attend(EC). attend(CP) :- attend(EC). attend(CP) :- attend(FA). attend(DD) …


5
哈希表操作O(1)适用于哪种数据?
从(何时)的答案是哈希表查找O(1)?,我收集到,当数据满足某些统计条件时,哈希表具有最坏情况的行为,至少已摊销,并且有一些技术可以使这些条件变宽。O(1)O(1)O(1) 但是,从程序员的角度来看,我事先并不知道我的数据是什么:它通常来自某些外部来源。而且我很少一次拥有所有数据:插入和删除的发生率经常不低于查找率,因此需要对数据进行预处理以微调哈希函数。 因此,迈出一步:在掌握了有关数据源的一些知识之后,如何确定哈希表是否有机会进行操作,以及可能在哈希函数上使用哪些技术?O(1)O(1)O(1)

1
利用范畴理论框架的单子自然发生
今天,亨宁·科斯坦(Henning Kerstan)的演讲(“概率转移系统的轨迹语义”)使我第一次遇到了范畴论。他建立了一个理论框架,以一般方式描述概率过渡系统及其行为,即具有无穷无穷的状态集和不同的迹线概念。为此,他经历了几层抽象,最后得出了monad的概念,并将其与测度理论相结合来构建所需的模型。 最后,他花了45分钟时间(大致)构建了一个框架来描述他最初在5分钟内解释的概念。我欣赏这种方法的优点(它确实很好地概括了痕迹的不同概念),但仍然使我感到奇怪。 我很难理解一个monad到底是什么,以及一个概念在应用程序中(在理论上和实践上)多么有用。就结果而言,真的值得付出努力吗? 因此这个问题: 是否存在可以应用单子抽象概念的自然问题(就CS而言),并且可以帮助(甚至起到工具作用)获得期望的结果(完全或以比没有时更好的方式)?

4
算法中的递归和生成函数
组合学在计算机科学中起着重要作用。我们经常在分析以及算法设计中使用组合方法。例如,一种用于在图形中查找ķķk顶点覆盖集的方法可能只是检查所有( nķ)(ñķ)\binom{n}{k}可能的子集。尽管二项式函数呈指数增长,但如果ķķk是某个固定常数,我们将通过渐近分析得出多项式时间算法。 通常,现实生活中的问题需要更复杂的组合机制,我们可以根据复发情况定义这些机制。一个著名的例子是斐波那契数列(天真的)定义为: F(n )= ⎧⎩⎨1个0F(n − 1 )+ f(n − 2 )如果 n = 1如果 n = 0除此以外F(ñ)={1个如果 ñ=1个0如果 ñ=0F(ñ-1个)+F(ñ-2)除此以外f(n) = \begin{cases} 1 & \text{if } n = 1 \\ 0 & \text{if } n = 0 \\ f(n-1) + f(n-2) & \text{otherwise} \end{cases} 现在,使用该递归计算第ññn个项的值呈指数增长,但是由于有了动态编程,我们可以在线性时间内对其进行计算。现在,并不是所有的递归都适合于DP(即阶乘函数),但是当将某些计数定义为递归而不是生成函数时,它是潜在的可利用属性。 生成函数是一种对给定结构进行形式化计数的优雅方法。也许最著名的是定义为的二项式生成函数: (x + y)α= …

3
在非功能设置中实施关闭的问题
在编程语言中,闭包是一种流行且经常需要的功能。维基百科说(强调我的): 在计算机科学中,闭包(...)是一个函数,以及对该函数的非局部变量的引用环境。闭包允许函数访问其直接词法范围之外的变量。 因此,闭包本质上是一个(匿名?)函数值,可以使用超出其自身范围的变量。以我的经验,这意味着它可以访问定义点范围内的变量。 实际上,至少在函数式编程之外,这个概念似乎有所不同。不同的语言实现了不同的语义,甚至似乎还有意见之战。许多程序员似乎不知道闭包是什么,只把它们看作是匿名函数。 同样,在实现闭包时似乎存在主要障碍。最值得注意的是,Java 7本应包含它们,但该功能已推回将来的版本。 为什么闭包这么难(难以理解和实现)?这个问题过于笼统和含糊不清,因此让我将重点放在这些相互关联的问题上: 在常见的语义形式主义(小步骤,大步骤等)中表达闭包是否存在问题? 现有的类型系统是否不适合封闭并且无法轻松扩展? 使闭包与传统的基于堆栈的过程转换保持一致是否有问题? 请注意,该问题通常与程序,面向对象和脚本语言有关。据我所知,函数式语言没有任何问题。

3
具有恒定时间操作的智能内存管理?
让我们考虑一个内存段(可以在需要时增大或缩小文件的大小,就像文件一样),您可以在该内存段上执行两个涉及固定大小块的基本内存分配操作: 分配一个块 释放先前已分配的不再使用的块。 同样,作为一项要求,不允许内存管理系统在当前分配的块之间移动:它们的索引/地址必须保持不变。 最幼稚的内存管理算法将增加一个全局计数器(初始值为0),并将其新值用作下一个分配的地址。但是,当只剩下几个分配的块时,这绝不允许缩短段。 更好的方法:保留计数器,但维护一个释放块列表(可以在固定时间内完成),并在不为空的情况下将其用作新分配的源。 接下来是什么?在保持恒定的时间分配和解除分配约束的情况下,有什么办法可以使内存段尽可能地短而可以完成? (目标可能是使用最小的地址跟踪当前未分配的块,但是在恒定时间内似乎不可行……)

3
是什么使量子计算机特别有用?
我知道量子计算机能够通过一次逻辑处理所有可能状态的叠加。 人们似乎指的是使量子计算机特别或有用的东西。 但是,在处理了叠加输入之后,您将获得一个叠加结果,您只能提出一个问题,并且它会折叠为一个值。我也知道不可能(当前吗?)克隆叠加状态,因此您一直无法获得一个问题的答案。 在这两种情况下,似乎多处理能力实际上都没有给您带来任何好处,因为它有效地好像只处理了一种状态。 我是在误解事物,还是量子计算的真正有用性来自其他? 谁能解释一下别的东西吗?

5
以√n为参数求解递归关系
考虑复发 T(n)=n−−√⋅T(n−−√)+cnT(n)=n⋅T(n)+cn\qquad\displaystyle T(n) = \sqrt{n} \cdot T\bigl(\sqrt{n}\bigr) + c\,n 对于n>2n>2n \gt 2且具有一些正常数,并且。T (2 )= 1cccT(2)=1T(2)=1T(2) = 1 我知道用于解决递归的Master定理,但是我不确定如何使用它来解决这种关系。您如何计算平方根参数?

4
如何检查两种算法是否对任何输入返回相同的结果?
当所有输入的集合都是无限的时,如何检查两种算法(例如,合并排序和朴素排序)对于任何输入是否返回相同的结果? 更新:感谢Ben解释了在一般情况下如何通过算法无法做到这一点。Dave的答案很好地总结了算法方法和手动方法(受人类智慧和隐喻的影响),这些方法并不总是有效的,但却非常有效。

3
为什么循环比递归快?
在实践中,我知道任何递归都可以写成一个循环(反之亦然(?)),如果我们用实际的计算机进行测量,我们发现对于相同的问题,循环比递归要快。但是,有什么理论可以使这种区别发生或者它主要是实证的?

8
为什么我们可以假设算法可以表示为位字符串?
我开始读一本关于计算复杂性和图灵机的书。这是报价: 一旦确定某种规范编码,就可以将算法(即机器)表示为位字符串。 提供此断言只是一个简单的事实,但我无法理解。 例如,如果我有一个算法,将作为输入并计算或:(x + 1 )2XXx(x + 1)2(X+1个)2(x+1)^2 int function (int x){ x = x + 1; return x**2; } 如何使用字母将其表示为字符串?{ 0 ,1 }∗{0,1个}∗\{0, 1\}^*



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.