计算机科学

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

5
证明编译器无法检测到无效代码
我打算讲授有关各种主题的冬季课程,其中之一将是编译器。现在,我在考虑整个季度要分配的作业时遇到了这个问题,但是这让我很困惑,因此我可以用它作为示例。 public class DeadCode { public static void main(String[] args) { return; System.out.println("This line won't print."); } } 在上面的程序中,很明显,由于,print语句将永远不会执行return。编译器有时会给出有关死代码的警告或错误。例如,以上代码将无法在Java中编译。但是,javac编译器不会在每个程序中检测到所有死代码实例。我如何证明没有编译器可以这样做?

5
普通语言能否图灵完整?
我在阅读有关Iota和Jot的文章,发现本节令人困惑: 与Iota不同,在Iota中,字符串的语法树可以在左侧或右侧分支,而Jot语法统一在左分支。结果,Iota完全不受上下文限制,但Jot是常规语言。 我的理解是Iota和Jot都完成了。但显然,一个是上下文无关的,另一个是常规的!常规语言肯定不能完善图灵吗?

7
打开程序时,操作系统是否注入自己的机器代码?
我正在研究CPU,我知道它如何从内存中读取程序并执行其指令。我还了解到,操作系统将进程中的程序分开,然后在各个程序之间如此快速地切换,以至于您认为它们在同一时间运行,但实际上每个程序都在CPU中单独运行。但是,如果OS也是在CPU中运行的一堆代码,那么它如何管理进程? 我一直在思考,我唯一能想到的解释是:当操作系统将程序从外部存储器加载到RAM时,它会在原始程序指令的中间添加自己的指令,然后执行该程序,可以调用操作系统并执行某些操作。我相信操作系统会添加一条指令到程序中,这将允许CPU在一段时间后返回到操作系统代码。而且,我相信操作系统加载程序时,它会检查是否存在一些禁止的指令(该指令会跳转到内存中的禁止访问地址)并消除该指令。 我在想严厉吗?我不是CS学生,但实际上不是数学学生。如果可能的话,我会想要一本好书,因为如果操作系统也是一堆在CPU中运行的代码,并且无法同时运行,那么我找不到能解释操作系统如何管理进程的人。节目时间。这些书仅说明操作系统可以管理事物,但现在可以管理事物。

3
对纯/依赖类型系统的简要但完整的解释是什么?
如果简单,那么只需几句话就可以完全解释。可以对λ微积分进行此操作: λ演算是具有归约规则的语法(基本上是结构)(这意味着对特定模式的每次出现都会重复应用搜索/替换过程,直到不存在这种模式为止)。 语法: Term = (Term Term) | (λ Var . Term) | Var 归约规则: ((λ var body) term) -> SUBS(body,var,term) where `SUBS` replaces all occurrences of `var` by `term` in `body`, avoiding name capture. 例子: (λ a . a) -> (λ a a) ((λ a . (λ b . …

2
什么是暂停状态未知的超短程序?
Binary Lambda微积分中的这个579位程序的暂停状态未知: 01001001000100010001000101100111101111001110010101000001110011101000000111001110 10010000011100111010000001110011101000000111001110100000000111000011100111110100 00101011000000000010111011100101011111000000111001011111101101011010000000100000 10000001011100000000001110010101010101010111100000011100101010110000000001110000 00000111100000000011110000000001100001010101100000001110000000110000000100000001 00000000010010111110111100000010101111110000001100000011100111110000101101101110 00110000101100010111001011111011110000001110010111111000011110011110011110101000 0010110101000011010 即,不知道该程序是否终止。为了确定它,您必须求解Collat​​z猜想 -或至少求解所有2≤256的数字。在此存储库中,有关于如何获取此程序的完整说明。 是否有(很多)较短的BLC程序也具有未知的停止状态?

3
弗洛伊德循环检测算法| 确定周期的起点
我正在寻求帮助来了解弗洛伊德的循环检测算法。我已经对Wikipedia(http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare)进行了解释。 我可以看到算法如何检测O(n)时间的周期。但是,我无法想象这样一个事实,即一旦乌龟和野兔指针第一次相遇,就可以通过将乌龟指针移回起点,然后一次移动乌龟和野兔一步来确定周期的开始。他们初次见面的时间就是周期的开始。 有人可以提供一种解释,希望与维基百科上的解释有所帮助,因为我无法理解/可视化它?


5
寻找有趣的字谜
假设和是两个长度相同的字符串。两个字符串的拼写是双射映射这样每个。a1a2…ana1a2…ana_1a_2\ldots a_nb1b2…bnb1b2…bnb_1b_2\ldots b_np:[1…n]→[1…n]p:[1…n]→[1…n]p:[1\ldots n]\to[1\ldots n]ai=bp(i)ai=bp(i)a_i = b_{p(i)}iii 同一对字符串可能不止一个拼写。例如,如果 `abcab`和我们有和等。a=a=a=b=b=b=cababp1[1,2,3,4,5]→[4,5,1,2,3]p1[1,2,3,4,5]→[4,5,1,2,3]p_1[1,2,3,4,5]\to[4,5,1,2,3]p2[1,2,3,4,5]→[2,5,1,4,3]p2[1,2,3,4,5]→[2,5,1,4,3]p_2[1,2,3,4,5] \to [2,5,1,4,3] 我们要说的是,词法的权重 是一个人必须在第一个字符串中进行剪切的次数,才能获得可以重新排列以获取第二个字符串的块。形式上,这是的值个数,其中。也就是说,它是在该点的数量不会不正好1.适用于例如增加,和,因为切割一次,进入块和,和切口4次,分为五个大块。w(p)w(p)w(p)pppi∈[1…n−1]i∈[1…n−1]i\in[1\ldots n-1]p(i)+1≠p(i+1)p(i)+1≠p(i+1)p(i)+1\ne p(i+1)pppw(p1)=1w(p1)=1w(p_1) = 1w(p2)=4w(p2)=4w(p_2) = 4p1p1p_11234512345p2p2p_212345 假设存在两个字符串和的拼写。然后,至少一个词法必须具有最小的权重。可以说这是最轻的。(可能有多个最简单的拼写;我不在乎,因为我只对权重感兴趣。)aaabbb 题 我想要一种算法,给定存在两个字符串的两个字串,它们可以有效地产生两个字符串最轻的字串的精确权重。如果该算法还能产生最轻巧的字词排序,也可以,但不是必须的。 生成所有拼写并对其进行加权是一件相当简单的事情,但是可能会有很多,所以我宁愿直接找到轻型拼写的方法。 动机 引起该问题的原因如下。使计算机搜索字典并查找字谜(包含完全相同的字母的单词对)非常容易。但是产生的许多字谜没有意思。例如,在《韦伯斯特第二国际词典》中找到的最长的例子是: 胆囊 十二指肠造口术十二指肠胆囊造口术 这个问题应该清楚:这些都是索然无味,因为他们承认一个很轻的anagramming,简单地交流cholecysto,duedeno和stomy段,对于一个体重2.在另一方面,这种更短的例子是更令人惊讶和有趣: 海岸线 剖面 这里最轻的字谜权重为8。 我有一个程序使用此方法来定位有趣的字谜,即所有字谜的权重很高的字谜。但这是通过生成并加权所有可能的拼写来实现的,这很慢。

2
为什么将常规语言称为“常规”?
我刚刚完成了第一章介绍计算理论由迈克尔·西蓬瑟这也解释了有限自动机的基本知识。 他将常规语言定义为可以由有限自动机描述的任何事物。但是我找不到他解释为什么普通语言称为“普通语言”的地方。在这种情况下,“常规”一词的起源是什么? 注意:我是新手,所以请尝试用简单的术语进行解释!

2
基数树和Patricia trys有什么区别?
我正在学习基数树(也称为压缩尝试)和Patricia尝试,但是我发现关于它们实际上是否相同的冲突信息。当节点是唯一的子节点时,可以通过将节点与其父节点合并来从基数(未压缩)的树中获得基数树。这也适用于帕特里夏(Patricia)尝试。两种数据结构在哪些方面有所不同? 例如,NIST将两者列出为相同: 帕特里夏树 (数据结构) 定义:Trie的紧凑表示,其中作为唯一子节点的任何节点都与其父节点合并。 也称为基数树。 网络上的许多消息来源都声称相同。但是,显然Patricia尝试是基数树的特例。维基百科条目说: PATRICIA尝试是基数等于2的基数尝试,这意味着将分别比较密钥的每个位,并且每个节点都是双向(即,左与右)分支。 我不太明白。区别仅在于进行查找时进行比较的方式吗?每个节点如何成为“双向分支”?ALPHABET_SIZE给定节点最多应该有最多分支吗? 有人可以澄清吗?出于实际目的,基数尝试是否通常像Patricia尝试一样实现(因此通常被认为是相同的)?还是不能做出这样的概括?

2
为什么我们相信PSPACE≠EXPTIME?
我在直觉上很难理解为什么通常认为PSPACE与EXPTIME不同。如果PSPACE是在输入大小为f (n )的空间多项式中可解决的问题集f(n)f(n)f(n),那么怎么会有一类经历较大指数时间膨胀且不利用指数空间的问题呢? Yuval Filmus的回答已经非常有用。但是,任何人都可以画出我的一个松散的说法,为什么它可能的情况是PSPACE≠EXPTIME(即PSPACE不是EXPTIME的真子集)?我们是否需要指数空间来突破系统配置总数的上限,而系统配置的总数可以随输入大小成倍地扩展?只能说,我可以理解为什么EXPTIME≠EXPSPACE是一个待解决的问题,但是我对PSPACE和EXPTIME之间的关系缺乏了解。

2
用少于N个随机位来模拟2 ^ N中的1的概率
说我需要模拟以下离散分布: P(X=k)={12N,1−12N,if k=1if k=0P(X=k)={12N,if k=11−12N,if k=0 P(X = k) = \begin{cases} \frac{1}{2^N}, & \text{if $k = 1$} \\ 1 - \frac{1}{2^N}, & \text{if $k = 0$} \end{cases} 最明显的方法是绘制NNN随机位,并检查它们是否均等于000(或111)。但是,信息论说 S=−∑iPilogPi=−12Nlog12N−(1−12N)log(1−12N)=12Nlog2N+(1−12N)log2N2N−1→0S=−∑iPilog⁡Pi=−12Nlog⁡12N−(1−12N)log⁡(1−12N)=12Nlog⁡2N+(1−12N)log⁡2N2N−1→0 \begin{align} S & = - \sum_{i} P_i \log{P_i} \\ & = - \frac{1}{2^N} \log{\frac{1}{2^N}} - \left(1 - \frac{1}{2^N}\right) \log{\left(1 - \frac{1}{2^N}\right)} …

2
NP中不存在但可以确定的NP-Hard问题
我想知道是否有一个很好的例子说明了一个易于理解的,不是NP完全且不确定的NP-Hard问题? 例如,暂停问题是NP-Hard,而不是NP-Complete,但无法确定。 我认为这意味着可以解决问题的解决方案而不是多项式时间内的问题。(如果不是这种情况,请更正此声明)。

8
计算机如何确定字节的数据类型?
例如,如果计算机已10111100存储在RAM的特定字节中,计算机如何知道将此字节解释为整数,ASCII字符或其他内容?类型数据是否存储在相邻字节中?(我认为情况并非如此,因为这将导致一个字节使用两倍的空间。) 我怀疑也许计算机甚至不知道数据类型,只有使用它的程序才知道。我的猜测是,由于RAM是R AM,因此不能按顺序读取,因此某个特定程序只是告诉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.