计算机科学

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

1
Kolmogorov-复杂度定义的等价
定义Kolmogorov复杂度的方法有很多,通常,所有这些定义在加法常数之前都是等效的。也就是说,如果和是kolmogorov复杂度函数(通过不同的语言或模型定义),则存在常数使得对于每个字符串,。我相信这是因为对于每个Kolmogorov复杂度函数以及对于每个它都认为,对于某些常数。K1K1K_1K2K2K_2cccxxx|K1(x)−K2(x)|&lt;c|K1(x)−K2(x)|&lt;c|K_1(x) - K_2(x)| < cKKKxxxK(x)≤|x|+cK(x)≤|x|+cK(x) \le |x| +cccc 我对以下基于图灵机的定义感兴趣KKK 状态数:将定义为最小数,以使具有个状态的TM 在空字符串上输出。K1(x)K1(x)K_1(x)qqqqqqxxx 程序长度:将定义为输出的最短“程序” 。即,修复一种将TM编码为二进制字符串的方法;对于机器其(二进制)编码表示为。 其中最小值在空输入上输出x的所有M上。K2(x)K2(x)K_2(x)xxxMMM⟨M⟩⟨M⟩\langle M \rangleK2(x)=min|⟨M⟩|K2(x)=min|⟨M⟩|K_2(x) = \min |\langle M \rangle|MMMxxx 是K1K1K_1和K2K2K_2等同?它们之间是什么关系,如果它们不相等,哪一个可以更好地理解Kolmogorov复杂性的概念。 令我特别困扰的是xK2K2K_2随K的增加率,它似乎不是超线性的(或者至少在常数C&gt; 1的情况下是线性的,使得K_2 &lt;C | x |而不是| x | + c)。考虑输出x的最简单的TM- 仅将x编码为其状态和转移函数的一部分的TM 。立即看到 K_1(x)\ le | x | +1。但是,同一台机器的编码要大得多,而我得到的琐碎边界是K_2(x)\ le | x | \ log | x | 。xxxC&gt;1C&gt;1C>1K2&lt;C|x|K2&lt;C|x|K_2 …

3
解析任意上下文无关的语法,主要是简短的摘要
我想解析用户定义的域特定语言。这些语言通常接近数学符号(我不是在解析自然语言)。用户以BNF表示法定义其DSL,如下所示: expr ::= LiteralInteger | ( expr ) | expr + expr | expr * expr 像输入1 + ( 2 * 3 )必须接受,而像输入1 +必须予以拒绝为不正确,并输入像1 + 2 * 3必须被拒绝暧昧。 这里的中心难题是以一种用户友好的方式处理模棱两可的语法。限制语法的唯一性不是一种选择:这就是语言的方式-想法是作者宁愿在不必要时避免使用括号来避免歧义。只要表达式不是模棱两可的,我就需要解析它,如果不是,我就必须拒绝它。 我的解析器必须能够处理任何与上下文无关的语法,即使是模棱两可的语法,也必须接受所有明确的输入。我需要所有接受的输入的分析树。对于无效或模棱两可的输入,理想情况下,我希望得到良好的错误消息,但首先,我将尽我所能。 通常,我将在相对较短的输入上调用解析器,而偶尔会有较长的输入。因此,渐近更快的算法可能不是最佳选择。我想针对少于80个符号长的输入,大约20%和50个符号之间的19%以及很少的较长输入的1%的分布进行优化。无效输入的速度不是主要问题。此外,我希望大约每1000至100000个输入都可以修改DSL。我可以花几秒钟来预处理我的语法,而不是几分钟。 给定我的典型输入大小,我应该研究哪种解析算法?错误报告应该成为我选择的一个因素,还是应该专注于解析明确的输入并可能运行一个完全独立的,较慢的解析器以提供错误反馈? (在需要时(前一段时间)的项目中,我使用了CYK,实现起来并不难,并且可以很好地适应我的输入大小,但不会产生非常好的错误。)

2
通用类型是存在类型的子类型还是特例?
此问题是从软件工程堆栈交换迁移的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 我想知道一个普遍-量化类型是否:Ť 一个 = ∀ X :{ 一个∈ X ,˚F :X → { Ť ,˚F } }是一个存在限定的一个子类型,或特殊情况下,键入Ť Ë具有相同签名:Ť è = ∃ X :{ 一个∈ X ,˚F :X → { Ť ,˚F } }Ť一种TaT_aŤ一种= ∀ X:{ 一个∈ X,˚F:X→ { T,F} }Ta=∀X:{a∈X,f:X→{T,F}}T_a = \forall X: \left\{ a\in X,f:X→\{T, F\} \right\}ŤËTeT_eŤË= …


5
有效压缩未标记的树木
考虑未标记的,有根的二叉树。我们可以压缩这些树:每当有指向子树TŤT和T′Ť′T'与T=T′Ť=Ť′T = T'(解释===为结构相等),我们店(wlog)TŤT并更换所有指针T′Ť′T'与指针TŤT。有关示例,请参见uli的答案。 给出一种将上述意义上的树作为输入并计算压缩后剩余的(最小)节点数的算法。该算法应在时间O(nlogn)Ø(ñ日志⁡ñ)\cal{O}(n\log n)(在统一成本模型中)运行,输入中的节点数为nñn。 这是一个考试问题,我无法提出一个很好的解决方案,也没有看到一个解决方案。

3
SQL捕获
据Immerman,与相关联的复杂类SQL查询是完全类的安全的查询在Q(FO(COUNT))Q(FO(COUNT))\mathsf{Q(FO(COUNT))}(一阶查询加计数操作者):SQL捕获安全查询。(换句话说,所有SQL查询具有复杂Q(FO(COUNT))Q(FO(COUNT))\mathsf{Q(FO(COUNT))},并且在所有的问题Q(FO(COUNT))Q(FO(COUNT))\mathsf{Q(FO(COUNT))}可以表示为一个SQL查询。) 基于此结果,从理论上讲,存在许多可以有效解决但在SQL中无法表达的有趣问题。因此,仍然有效的SQL扩展似乎很有趣。所以这是我的问题: 是否有SQL的扩展(在行业中实现和使用),它可以捕获PP\mathsf{P}(即可以表示所有多项式时间可计算查询,而不能表示其他查询)? 我想要一种满足所有三个条件的数据库查询语言。这是很容易定义的扩展,它会扩展SQL和将捕获PP\mathsf{P}。但是我的问题是,从实践的角度来看,这种语言是否有意义,所以我希望在实践中使用这种语言。如果不是这种情况,并且没有这种语言,那么我想知道是否有某种原因使这种语言从实际角度变得无趣?例如,实践中出现的查询通常是否足够简单,以至于不需要这种语言?

7
证明P≠NP比证明P = NP难吗?
考虑P对NP问题的两种可能性:P = NP和P NP。≠≠\neq 令Q为已知的NP难题之一。为了证明P = NP,我们需要为Q设计一个多项式时间算法A,并证明A正确地解决了Q。 为了证明P NP,我们需要证明 没有多项式时间算法可以求解Q。换句话说,我们必须排除所有多项式时间算法。≠≠\neq 我听说有人说这使第二个任务更加困难(假设这确实是事实)。 有理由认为证明P = NP(假设P = NP)比证明P NP(假设P NP)容易吗?≠≠≠\neq≠≠\neq

2
实际中是否已将链接剪切树用于最大流量计算或其他应用程序?
通过使用动态树(也称为链接剪切树),我通常会看到许多实现的最大流算法,狄尼克算法,推入重贴标签以及其他算法可以改善其渐近时间成本。 推重贴标签通常在或或,但带有动态树Ø (V2Ë)Ø(V2Ë)O(V^2E)Ø (V3)Ø(V3)O(V^3)Ø (V2Ë--√)Ø(V2Ë)O(V^2\sqrt{E})Ø (VË日志(五2/ E))Ø(VË日志⁡(V2/Ë))O(VE \log(V^2/E)) Dinic的算法在,但具有动态树Ø (V2Ë)Ø(V2Ë)O(V^2E)Ø (VË日志(五))Ø(VË日志⁡(V))O(VE\log(V)) 但是,大多数库中的最大流算法的实际实现似乎并未利用此数据结构。在实践中是否曾使用动态树进行最大流量计算?还是它们承担了过多的开销以至于无法解决现实世界中的问题规模? 是否还有其他使用链接剪切树的问题域? 这个问题与我在cstheory上提出的一个问题有关:现有技术中的最大流量算法是否可行?


7
为什么浮点表示使用符号位而不是2的补码来表示负数
考虑一个定点表示形式,可以将其视为浮点数的退化情况。负数完全可以使用2的补码。但是,为什么浮点数需要一个符号位,尾数位不应该使用2的补码? 同样,为什么指数位使用偏差而不是有符号的幅度表示(类似于尾数位)或2的补码表示? 更新:对不起,如果我不清楚。我一直在寻找浮点表示形式是如何成形的。如果在替代方案之间没有强大的实现权衡,那么有人可以解释浮点表示的历史方面吗?

1
查找稀疏图的周长的最佳算法?
我想知道如何找到一个稀疏无向图的周长。稀疏的意思是。最佳的意思是最低的时间复杂度。|E|=O(|V|)|E|=O(|V|)|E|=O(|V|) 我考虑过对Tarjan的无向图算法进行一些修改,但是没有找到好的结果。实际上,我以为,如果我可以在找到2个相连的分量,那么可以通过从第一部分实现的某种归纳法找到周长。不过,我可能走错了路。渐近优于(即)的任何算法都可以使用。Θ (| V | 2)o (| V | 2)O(|V|)O(|V|)O(|V|)Θ(|V|2)Θ(|V|2)\Theta(|V|^2)o(|V|2)o(|V|2)o(|V|^2)

4
一般而言,哪些线程共享?
好吧,这是一个普遍的问题。而且,如果有人想使其实现特定,那么我将更喜欢Unix相关的东西。但首先需要普遍了解以下问题: 我读到单个进程可以有多个线程。同一进程的多个线程确实在它们之间共享事物。我想知道他们分享什么,不分享什么。考虑到进程由地址空间,堆栈,堆,全局变量,代码,数据,OS资源组成,线程之间共享哪些资源?我有以下猜测: 全局变量-我已读取线程共享全局变量。同样,在用Java和C#编程时,我创建了线程来共享类级变量。因此,我认为线程共享全局变量(尽管不能确定高级编程语言中的概念是否可以转换为低操作系统级别的事实)。 堆-由于全局变量存储在堆中,因此堆在线程之间共享。 堆栈-由于每个线程可以具有自己的执行序列/代码,因此它必须具有自己的堆栈,可以在该堆栈上推入/弹出程序计数器的内容(在发生函数调用和返回的情况下)。因此,同一进程的线程不共享堆栈。 现在我不确定以下内容的共享 地址空间-不确定在地址空间中到底要算什么。但是我想地址空间通常用于进程而不是线程的上下文中。而且,由于同一进程的所有线程与父进程位于同一地址空间,因此可以说线程共享地址空间。(但是,然后它们在同一地址空间内维护不同的堆栈吗?) 操作系统资源-我猜这可能是特定于实现的。例如,父进程可以选择性地将同一文件的句柄分配给它的某些线程,而不是全部。还是我误会了,操作系统资源意味着文件以外的东西? 代码-线程可以具有不同的代码,因此共享代码并非总是如此。 数据-不确定要在数据下考虑什么。但是请确保全局变量在线程之间共享。并确保不会局部共享局部变量。 总体而言,由于术语含糊,操作系统书籍中的超级概括以及在线提供的额外的实现特定细节,我感到非常困惑。因此,我试图找到一些令我满意的答案。

5
如何计算不同缓存的标签,索引和偏移量位数?
特别: 1)具有4096个块/行的直接映射缓存,其中每个块具有8个32位字。假设一个32位地址,那么标记和索引字段需要多少位? 2)与1)相同的问题,但需要完全关联的缓存吗? 如果我错了,请纠正我,是吗? 标签位=地址位长度-索引指数-偏移指数? [由于2 ^ 3 = 8,偏移量= 3还是2 ^ 5 = 32是5?


7
有什么特点
有时候,仔细检查一下,很容易确定算法的时间复杂度。具有两个嵌套循环算法显然为。该探索的所有可能的组合的算法两个值中的基团是明显。N 2 N 2 NñNNñ2N2N^2ñNN2ñ2N2^N 但是,我不知道如何“发现”具有复杂度的算法。例如,递归mergesort实现就是一个。mergesort或其他算法的共同特征是什么,如果我正在分析的话会给我一个提示?Θ (N log N )Θ (N日志ñ)Θ(Nlog⁡N)\Theta(N \log N)Θ (N日志ñ)Θ(Nlog⁡N)\Theta(N \log N) 我敢肯定,算法具有复杂度的方法不止一种,因此任何答案都值得赞赏。顺便说一句,我正在寻求一般特征和提示,而不是严格的证明。Θ (N日志ñ)Θ(Nlog⁡N)\Theta(N \log N)

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.