计算机科学

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

6
组,monoid和环在数据库计算中有什么用?
为什么像Twitter这样的公司会对诸如群,半体和环之类的代数概念感兴趣?在github:twitter / algebird上查看他们的存储库。 我所能找到的是: 有趣的近似算法(例如Bloom过滤器,HyperLogLog和CountMinSketch)的Monoid实现。这些使您可以像想数字一样思考这些复杂的操作,然后将它们加到hadoop或在线中以生成强大的统计信息和分析数据。 并在GitHub页面的另一部分中: 它最初是作为Scalding的Matrix API的一部分开发的,其中矩阵的值是Monoids,Groups或Rings的元素 。随后,很明显,该代码在Scalding和Twitter的其他项目中具有更广泛的应用。 这种更广泛的应用可能是什么?在Twitter上以及出于一般利益? 似乎数据库的组合聚合具有类单态结构。 关于Quora的相同问题:Twitter对抽象代数(与algebird一起)的兴趣是什么? 我有数学背景,但不是计算机科学家。拥有半身像和半群的“真实世界”使用将是很棒的。这些通常被认为是无用的理论构造,并且在许多抽象代数课程中都被忽略了(因为缺乏有趣的说法)。

7
PRNG可以用来魔术压缩东西吗?
这个想法是我小时候学习编程的想法,并且是第一次接触PRNG。我仍然不知道它有多现实,但是现在有了堆栈交换。 这是14岁的人使用的一种出色的压缩算法方案: 取一个PRNG并用种子s进行种子处理,以获得长序列的伪随机字节。要将序列发送给另一方,您只需要传达PRNG的说明,适当的种子和消息的长度。对于足够长的序列,该描述将比序列本身短得多。 现在,假设我可以反转该过程。如果有足够的时间和计算资源,我可以进行蛮力搜索,找到可以产生所需序列的种子(和PRNG,或者换句话说:一个程序)(比方说,一张有趣的猫调皮的照片)。 在生成足够多的比特之后,PRNG会重复,但是与“典型”周期相比,我的消息非常短,因此这似乎不是一个很大的问题。 Voila,一种有效的压缩数据方式(如果是rube-Goldbergian)。 因此,假设: 我希望压缩的序列是有限的,并且事先知道。 我的现金或时间并不短缺(只要两者都需要有限的金额) 我想知道: 该计划背后的推理是否存在根本缺陷? 分析这类思想实验的标准方法是什么? 摘要 通常,好的答案不仅可以弄清楚答案,而且可以弄清楚我真正要问的是什么。感谢大家的耐心配合和详细的答案。 这是我对答案的第n次尝试: PRNG /种子角度没有任何作用,只不过是生成所需序列作为输出的程序。 信鸽原理:长度大于k的消息比长度小于等于k的(消息生成)程序多。因此,某些序列根本不能成为比消息短的程序输出。 值得一提的是,程序(消息)的解释程序必须事先确定。它的设计确定了接收到长度为k的消息时可以生成的(小)消息子集。 至此,原始的PRNG想法已经死了,但是至少还有一个最后的问题需要解决: 问:我能幸运地发现我的长(但有限)消息恰好是长度小于k位的程序的输出吗? 严格来说,这不是偶然的问题,因为必须事先知道所有可能的消息(程序)的含义。要么是 <k位的一些信息的含义或它不是。 如果我随机选择一个随机消息,该消息>> k位(为什么?),无论如何我都将拥有使用少于k位发送消息的可能性,并且几乎可以肯定无法发送它完全使用不到k位。 OTOH,如果我从少于k位的程序输出中选择大于等于k位的特定消息(假设有这样的消息),那么实际上我是在利用已经传输到接收方(解释程序的设计),它被视为已传输消息的一部分。 最后: 问:熵 / kolmogorov复杂度业务到底是什么? 最终,两者都告诉我们与(简单的)信鸽原理告诉我们的一样,我们可以压缩的程度:也许一点也没有,也许有些,但是肯定不如我们想象的那么多(除非我们作弊)。

2
分代垃圾收集器本质上是缓存友好的吗?
典型的世代垃圾收集器将最近分配的数据保留在单独的内存区域中。在典型程序中,大量数据是短命的,因此,频繁收集年轻垃圾(较小的GC周期)而很少收集旧垃圾是内存开销和执行GC时间之间的良好折衷。 直觉上,随着主内存相对于高速缓存的等待时间比率的增加,与单区域垃圾收集器相比,世代垃圾收集器的好处应该增加,这是因为经常访问年轻区域中的数据并将它们全部保存在一个地方。实验结果是否证实了这种直觉?

6
具有非对称延迟的网络中的时钟同步
假定计算机具有未初始化的精确时钟。也就是说,计算机时钟上的时间是实时时间加上一些恒定的偏移量。计算机有一个网络连接,并且我们要使用连接,以确定常数的偏移量。BBB 简单的方法是计算机将查询发送到时间服务器,记录本地时间。时间服务器在时间接收查询,并将包含的回复发送回客户端,客户端在时间接收它。然后是,即。B+C1B+C1B + C_1TTTTTTB+C2B+C2B + C_2B+C1≤T≤B+C2B+C1≤T≤B+C2B + C_1 \le T \le B + C_2T−C2≤B≤T−C1T−C2≤B≤T−C1T - C_2 \le B \le T - C_1 如果网络传输时间和服务器处理时间是对称的,则。据我所知,在野外使用的时间同步协议NTP在此假设下运行。B=T−C1+C22B=T−C1+C22B = T - \dfrac{C_1 + C_2}{2} 如果延迟不是对称的,如何提高精度?有没有一种方法可以测量典型的Internet基础结构中的这种不对称性?

3
如何为功能语言建模算法复杂度?
算法复杂度被设计为与较低级别的细节无关,但是它基于命令式模型,例如,数组访问和修改树中的节点需要O(1)时间。在纯功能语言中不是这种情况。Haskell列表需要线性时间才能访问。修改树中的节点需要制作树的新副本。 那么功能语言是否应该有替代的算法复杂性建模?

8
是什么决定了编程语言的“速度”?
假设一个程序是用两种不同的语言编写的,让它们分别是语言X和语言Y,如果它们的编译器生成相同的字节码,为什么我应该使用语言X而不是语言Y?是什么定义了一种语言比另一种语言快? 我之所以这么问,是因为经常看到人们说这样的话:“ C是最快的语言,ATS是和C一样快的语言”。我试图了解编程语言“快速”的定义。

2
赖斯定理感到困惑
摘要:根据赖斯定理,一切都是不可能的。但是,我一直都在做这不可能的事情! 当然,赖斯定理并不仅仅是说“一切皆有可能”。它说得更具体一些:“计算机程序的每个属性都是不可计算的。” (如果要分割头发,则每个“非平凡的”属性。也就是说,所有程序具有或没有程序具有的属性都是微不足道的。但是其他任何属性都是不可计算的。) 这就是定理说的或似乎要说的。大概许多非常聪明的人已经仔细验证了该定理的正确性。但这似乎完全违背了逻辑!程序具有众多特性,可以轻松计算!!例如: 程序在暂停之前执行多少步?要确定此数字是有限的还是无限的,恰好是停止问题,该问题不可计算。决定此数字是大于还是小于某个有限的是微不足道的!只需运行该程序最多n步,然后查看它是否停止。简单!nnnnnn 同样,程序在前m个执行步骤中使用的存储单元是否少于nnn个?微不足道的。mmm 程序文本中是否提到了名为k的变量kkk?简单的文本分析将揭示答案。 程序是否调用命令σσ\sigma?再次,扫描程序文本以查找该命令名称。 我可以看到很多性能之间做一下非可计算为好; 例如,一个完整的程序运行会执行多少次添加?嗯,这几乎与询问程序执行多少步骤相同,这实际上是“停止问题”。但是看起来确实有很多程序属性,它们确实非常容易计算。然而,赖斯定理坚持认为它们都不是可计算的。 我在这里想念什么?


3
阶乘算法比朴素乘法更有效
我知道如何使用迭代和递归(例如n * factorial(n-1),例如)为阶乘编码。我读过一本教科书(没有给出任何进一步的解释),发现通过递归将因式分解成两半,有一种更有效的编码方式。 我知道为什么会这样。但是我想尝试自己编码,但是我不知道从哪里开始。一位朋友建议我先写基本案例。我当时在考虑使用数组,以便可以跟踪数字...但是我真的看不出设计这种代码的任何出路。 我应该研究哪种技术?

2
是否有天生的模棱两可和确定性的上下文无关语言?
当且仅当确定性下推式自动机可以接受上下文无关的语言时,我们才将其称为确定性语言,否则将其称为不确定性。 当且仅当生成该语言的所有无上下文语法都模棱两可,否则,我们才将上下文无关的语言固有地称为歧义。 确定性,明确语言的示例是以下语言: 一种不确定的,明确的语言的示例是以下语言: { 瓦特∈ { 一个,b } * | w = w R }{ añbñ∈ { a ,b }∗| Ñ≥0}{一种ñbñ∈{一种,b}∗|ñ≥0}\{a^{n}b^{n} \in \{a, b\}^{*} | n \ge 0\}{ 瓦特∈ { 一个,b }∗| w= w[R}{w∈{一种,b}∗|w=w[R}\{w \in \{a, b\}^{*} | w = w^{R}\} 在Wikipedia中,固有的模棱两可的上下文无关语言的一个示例是以下上下文无关语言的联合,它们也必须是上下文无关的: L = { añb米C米dñ∈ { a ,b …

3
决策问题与并非是或不是的“实际”问题
我在很多地方都读到有些问题很难近似( NP很难近似 )。但是,逼近并不是一个决定性的问题:答案是一个实数,而不是是或否。同样对于每个所需的逼近因子,有许多正确的答案和许多错误的答案,并且随着所需的逼近因子而变化! 因此,如何说这个问题是NP问题呢? (灵感来自有向图中计算两个节点之间的简单路径的数量有多困难?)中的第二个项目符号。)

3
逻辑到底是什么?
道歉可能是要问有关前提条件的另一个问题,但是我对起点感到困惑。我遇到过各种术语,例如“模态逻辑”,“时间逻辑”,“一阶逻辑”,“二阶逻辑”和“高阶逻辑”。 在这种情况下,“逻辑”到底是什么意思?我们如何严格定义“逻辑”一词? 在浏览了几本书的开始部分之后,我可以粗略得出结论:“逻辑是一种从中决定内容的方法,这对设计编程语言非常重要,因为它指示并促进了程序的设计以自动推理和理解程序。我想要稍微详细地了解第二点。 现在来看这些逻辑。 所有这些逻辑(“时间逻辑”,“模态逻辑”,“一阶逻辑”,“高阶逻辑”)是否彼此独立,或者我们需要了解这些逻辑中的几个即可理解该组中的其他逻辑?简而言之,它们的先决条件是什么?(如果我也可以从一些材料中获得建议,那将是很棒的。) PS:非常感谢您的好意

3
Martin-Löf类型理论简介
什么是PerMartin-Löfs关于类型理论的最佳介绍?我看过俄勒冈PL暑期学校的一些讲座,但仍然对以下问题感到困惑: 什么是类型? 我知道集合是什么,因为您可以通过常规的ZF公理定义它们,并且它们具有非常直观的具体模型;试想一下装满东西的篮子。但是,我还没有看到类型的合理定义,并且我想知道是否有某些来源可以将这种想法提炼为假人。

11
为什么计算机科学中的数据被认为是离散的?
我了解数据的“结构”完全取决于布尔代数,但是: 为什么将数据视为离散的数学实体而不是连续的数学实体? 与此相关: 在将数据构造为rrr维中的连续实体时,有哪些缺点或不变性受到侵犯? 我不是该领域的专家,因为我是本科数学学生,所以如果有人像我五岁时那样向我解释这一点,我将非常感激。

6
按渐近增长对函数进行排序
假设我有一个功能列表,例如 nloglog(n),2n,n!,n3,nlnn,…nlog⁡log⁡(n),2n,n!,n3,nln⁡n,…\qquad n^{\log \log(n)}, 2^n, n!, n^3, n \ln n, \dots 如何渐近地对它们进行排序,即在由 f≤Og⟺f∈O(g)f≤Og⟺f∈O(g)\qquad f \leq_O g \iff f \in O(g), 假设它们确实是成对可比的(另请参见此处)?使用的定义似乎很尴尬,并且通常很难证明合适的常数和的存在。Ç Ñ 0OOOcccn0n0n_0 这是关于复杂度的量度,因此我们对渐进行为感兴趣,并且我们假定所有函数仅采用非负值()。∀ Ñ ,˚F (Ñ )≥ 0n→+∞n→+∞n \to +\infty∀n,f(n)≥0∀n,f(n)≥0\forall n, f(n) \ge 0

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.