计算机科学

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

6
我们如何假设对数字的基本运算需要固定的时间?
通常,在算法中,我们不关心数字的比较,加法或减法-我们假设它们在时间。例如,当我们说基于比较的排序是时,我们就假设了这一点,但是当数字太大而无法放入寄存器时,我们通常将它们表示为数组,因此基本操作需要为每个元素进行额外的计算。O (n log n )O (1 )O(1)O(1)Ø (ñ 日志n )O(nlog⁡n)O(n\log n) 是否有证据表明可以在完成两个数字(或其他原始算术函数)的比较?如果不是,为什么我们说基于比较的排序是?O (n log n )O (1 )O(1)O(1)Ø (ñ 日志n )O(nlog⁡n)O(n\log n) 我遇到这个问题时,我回答了一个SO问题,我意识到,我的算法是不,因为我迟早要处理大INT,也是它不是伪多项式算法,它是。PO (n )O(n)O(n)PPP

9
为什么加法运算与现代处理器中的按位运算一样快?
我知道在现代处理器上按位运算是如此之快,因为它们可以并行地以32或64位进行操作,因此按位运算仅需一个时钟周期。但是加法是一个复杂的操作,至少包含一个(可能多达十二个)按位运算,因此我自然认为它会慢3-4倍。经过一个简单的基准测试,我惊讶地发现加法运算与任何按位运算(XOR,OR,AND等)完全一样快。谁能阐明这一点?

9
编程语言的哪些属性使得无法进行编译?
题: “某种编程语言的某些属性可能要求将代码写入其中的唯一方法是通过解释来执行。换句话说,不可能编译成传统CPU的本机代码。这些属性是什么?” 编译器:Parag H. Dave和Himanshu B. Dave的原则和实践(2012年5月2日) 这本书没有给出答案的任何线索。我试图找到有关编程语言概念(SEBESTA)的答案,但无济于事。网络搜索也无济于事。你有什么线索吗?

4
(何时)哈希表查找为O(1)?
人们通常说哈希表查找是在恒定时间内进行的:您计算哈希值,这将为数组查找提供索引。但这忽略了碰撞。在最坏的情况下,每一项都恰好落在同一存储桶中,并且查找时间变为线性()。Θ(n)Θ(n)\Theta(n) 数据上是否存在可以使哈希表查找真正变为?这是仅是平均水平,还是哈希表可以进行最坏情况查找?O (1 )O(1)O(1)O(1)O(1)O(1)O(1) 注意:我是从程序员的角度出发的;当我将数据存储在哈希表中时,它几乎总是字符串或某些复合数据结构,并且数据在哈希表的生存期内发生变化。因此,尽管我欣赏有关完美哈希的答案,但从我的观点来看,它们很可爱,但很有趣,而且不切实际。 PS跟进:哈希表操作O(1)适用于哪种数据?

3
计算机如何跟踪时间?
计算机如何每次都能分辨出正确的时间和日期? 每当我关闭计算机(关闭计算机)时,内部的所有连接和进程都会停止。再次打开计算机时,如何显示正确的正确时间?关闭计算机时,计算机是否无法完全关闭?还有一些进程在运行吗?但是,当我取出电池(然后强行停止所有过程)并在几天后重新启动时,笔记本电脑如何指示正确的时间?

2
什么是共生?
我听说过(结构性)归纳法。它使您可以从较小的结构中构建有限的结构,并为证明这种结构的原理提供证明。这个想法很明确。 但是共生呢?它是如何工作的?怎么能说出无限结构的定论呢? 有(至少)两个角度需要解决,即共归作为一种定义事物的方式和一种证明技术。 关于共生作为证明技术,共生和双仿真之间是什么关系?

6
为什么图灵机是流行的计算模型?
我是CS本科生。我了解Turing是如何提出他的抽象机器(建模一个进行计算的人)的,但是在我看来,这是一个笨拙,优雅的抽象。我们为什么要考虑“磁带”,而机器头部要写符号,改变状态,来回移动磁带? 潜在的意义是什么?DFA非常优雅-似乎可以准确地捕获识别常规语言所必需的内容。但是根据我的新手判断,图灵机只是一个笨拙的抽象装备。 考虑一下之后,我认为最理想的计算模型是说,与输入字符串相对应的某个物理系统在被设置为运动后,将达到静态平衡,经解释,该平衡等于用于形成的静态平衡。从原始字符串开始的系统,将对应于正确的输出字符串。这捕获了“自动化”的概念,因为系统将仅基于原始状态确定性地进行更改。 编辑: 在阅读了一些答复之后,我意识到让Turing机器感到困惑的是,它似乎并不是最小的。规范的计算模型是否应该明显传达可计算性的本质? 另外,如果不清楚,我知道DFA并不是完整的计算模型。 感谢您的答复。

4
MapReduce的新颖之处是什么?
几年前,MapReduce被誉为分布式编程的革命。也有批评家但总的来说是热心的炒作。它甚至获得了专利![1] 这个名字让人联想到的map和reduce函数式编程,但是当我阅读(维基百科) 映射步骤:主节点获取输入,将其分为较小的子问题,然后将其分配给工作节点。辅助节点可以依次再次执行此操作,从而导致多层树结构。工作节点处理较小的问题,并将答案传递回其主节点。 减少步骤:主节点然后收集所有子问题的答案,并以某种方式将它们组合起来以形成输出-最初试图解决的问题的答案。 或[2] MAP的内部原理: MAP将输入值分割为多个单词。MAP旨在将输入的每个给定键/值对与潜在的许多中间键/值对相关联。 REDUCE的内部要素: [REDUCE]执行命令式聚合(例如,减少):采用许多值,并将其减少为单个值。 我忍不住想:这是分而治之(在Mergesort的意义上),简单明了!那么,MapReduce中是否存在(概念上的)新颖性,还是只是在某些情况下有用的旧思想的新实现? 美国专利7,650,331:“有效进行大规模数据处理的系统和方法”(2010) Google的MapReduce编程模型 -R.Lämmel(2007)重新审视

1
LL和LR语法的语言理论比较
人们经常说LR(k)解析器比LL(k)解析器更强大。这些陈述在大多数时候都含糊不清。特别是,我们应该比较固定的类还是所有的并集?那么情况如何呢?我尤其对LL(*)如何适合感兴趣。kkkkkk 据我所知,语法分析器LL和LR接受的各个语法集合是正交的,因此让我们来谈谈由各个语法集合产生的语言。令表示由解析器可以解析的语法生成的语言的类别,其他类别也类似。LR(k)LR(k)LR(k)LR(k)LR(k)LR(k) 我对以下关系感兴趣: LL(k)⊆?LR(k)LL(k)⊆?LR(k)LL(k) \overset{?}{\subseteq} LR(k) ⋃∞i=1LL(k)⊆?⋃∞i=1LR(k)⋃i=1∞LL(k)⊆?⋃i=1∞LR(k)\bigcup_{i=1}^{\infty} LL(k) \overset{?}{\subseteq} \bigcup_{i=1}^{\infty} LR(k) ⋃∞i=1LL(k)=?LL(∗)⋃i=1∞LL(k)=?LL(∗)\bigcup_{i=1}^{\infty} LL(k) \overset{?}{=} LL(*) LL(∗)∘?⋃∞i=1LR(k)LL(∗)∘?⋃i=1∞LR(k)LL(*) \overset{?}{\circ} \bigcup_{i=1}^{\infty} LR(k) 其中一些可能很容易。我的目标是收集一个“完整”的比较。参考被赞赏。

6
实践中的正式程序验证
作为软件工程师,我为工业产品编写了大量代码。相对复杂的东西,包括类,线程,一些设计工作,但也有一些性能折衷的地方。我做了很多测试,对测试感到厌倦,所以我对正式证明工具(例如Coq,Isabelle)产生了兴趣……我可以使用其中之一来正式证明我的代码没有错误并且可以完成吗用它?-但是,每当我检查其中一种工具时,我都不敢相信它们可用于日常软件工程。现在,那只能是我,而我正在寻找有关的指针/观点/想法:-) 具体来说,我的印象是,要使这些工具之一对我有用,就需要大量投资才能向证明者正确定义所考虑程序的对象,方法...。然后我想知道,鉴于证明者必须处理的所有事情,证明者是否会不仅仅耗尽精力。或者,也许我将不得不摆脱副作用(那些证明工具似乎对声明性语言确实非常有用),我想知道这是否会导致无法使用“经过验证的代码”,因为它不会很快,或者足够小。另外,我不能奢侈地更改使用的语言,它必须是Java或C ++:我不能告诉老板我从现在开始要使用OXXXml进行编码,因为它是OXXXml中唯一的语言。我可以证明代码的正确性... 拥有更多形式验证工具经验的人可以发表评论吗?再说一遍-我很喜欢使用正式的证明工具,我认为它们很棒,但是我给人的印象是它们位于象牙塔中,而Java / C ++的低谷使我无法达到……(PS:I也喜欢 Haskell,OCaml ...不要误解:我是声明性语言和形式证明的粉丝,我只是想看看我如何切实地将其用于软件工程) 更新:由于涉及的范围很广,让我们尝试以下更具体的问题:1)是否有使用证明来证明工业Java / C ++程序正确性的示例?2)Coq是否适合该任务?3)如果适合使用Coq,我应该先用Coq编写程序,然后再从Coq生成C ++ / Java吗?4)这种方法可以处理线程和性能优化吗?

7
立法NP是否完整?
我想知道是否有任何工作将法律法规与复杂性联系起来。特别是,假设我们有决策问题“考虑到这本法律书和这组特殊情况,被告有罪吗?” 它属于哪个复杂度类? 有结果证明纸牌游戏《魔术:聚会》既是NP又是图灵完备的,所以对于法律代码不应该存在类似的结果吗?

14
如何向父母解释我学习编程语言?
我目前正在完成计算机科学硕士学位。我对编程语言特别是类型系统感兴趣。我对这个领域的研究很感兴趣,下学期我将开始对该主题的博士学位。 现在这是一个真正的问题:我该如何向(以前)对计算机科学或相关领域没有知识的人解释自己的意愿? 标题来自以下事实:我什至无法向父母,朋友等解释自己的所作所为。是的,我可以说“重点在于帮助软件开发人员编写更好的软件”,但我认为这并不是真正有用的:他们不了解“编程”,他们不了解它的含义。感觉就像是我对中世纪的某人说我是一名汽车修理工:他们根本不知道我在说什么,更不用说如何改进它了。 有没有人与现实世界有很好的比喻?启发性的例子引起“啊哈”的时刻?我是否应该向60岁以上没有计算机科学(也没有学术经验)经验的人展示一段简短的代码?如果是这样,我应该使用哪种语言?这里有人遇到过类似的问题吗?

10
像Ruby / Python这样的动态语言能否达到性能一样的C / C ++?
我想知道是否可以为像Ruby这样的动态语言构建编译器,使其具有与C / C ++类似和可比的性能?根据我对编译器的了解,以Ruby为例,由于Ruby处理反射的方式,诸如从整数到大整数的自动类型转换以及缺少静态类型等特性,使得编译Ruby代码永远不可能高效地进行编译。对于Ruby来说非常困难。 是否有可能构建一个可以将Ruby或任何其他动态语言编译为与C / C ++非常接近的二进制文件的编译器?是否有根本的原因导致JIT编译器(例如PyPy / Rubinius)最终或永远无法在性能上与C / C ++相匹配? 注意:我确实知道“性能”可能是模糊的,所以要澄清一下,我的意思是,如果您可以在C / C ++中以X的性能执行X,那么您可以在Ruby / Python中以接近Y的性能执行X吗?X是从设备驱动程序和OS代码到Web应用程序的所有内容。


3
用于交织数组的就地算法
给你一个元素的数组2 n2ñ2n 一种1个,一2,... ,一ñ,b1个,b2,… bñ一种1个,一种2,…,一种ñ,b1个,b2,…bña_1, a_2, \dots, a_n, b_1, b_2, \dots b_n 任务是使用就地算法对数组进行交织,以使生成的数组看起来像 b1个,一1个,b2,一2,… ,bñ,一ñb1个,一种1个,b2,一种2,…,bñ,一种ñb_1, a_1, b_2, a_2, \dots , b_n, a_n 如果就地需求不存在,我们可以轻松地创建一个新数组并复制给出O(n )的元素O(n)Ø(ñ)\mathcal{O}(n)时间算法的。 根据就地需求,分而治之算法将算法提高为θ (Ñ 登录n )θ(ñ日志⁡ñ)\theta(n \log n)。 所以问题是: 是否有一个时间算法,它也就位?O(n)Ø(ñ)\mathcal{O}(n) (注意:您可以假设使用统一成本的WORD RAM模型,因此就地转换为空间限制)。O(1)Ø(1个)\mathcal{O}(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.