计算机科学

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

10
如果电荷的速度没有改变,计算机又会变得更快吗?
人人都知道,自发明以来,计算速度已大大提高,而且看来还将继续。但是有一件事让我感到困惑:如果您今天在某种材料上流过电流,它的传播速度与50年前使用相同的材​​料一样。 考虑到这一点,计算机如何变得更快?处理器设计的哪些主要领域赋予了如此惊人的速度? 我认为可能是以下一项或多项: 较小的处理器(电流流动的距离较小,但在我看来,您在这里只能获得少量收益)。 更好的材料

8
如何证明语言是正规的?
有很多方法可以证明某种语言不是正规语言,但是我需要做些什么来证明某种语言是正规语言呢? 例如,如果给我是规则的,那么我怎么能证明后面的L ′也是规则的呢?L大号LL′大号′L' L′:={w∈L:uv=w for u∈Σ∗∖L and v∈Σ+}大号′:={w∈大号:üv=w 对于 ü∈Σ∗∖大号 和 v∈Σ+}\qquad \displaystyle L' := \{w \in L: uv = w \text{ for } u \in \Sigma^* \setminus L \text{ and } v \in \Sigma^+ \} 我可以画一个不确定的有限自动机来证明这一点吗?

2
雷诺和泰曼的增长顺序定义
我正在阅读卡尔·雷诺兹(Carl Reynolds)和保罗·泰曼(Paul Tymann)撰写的一本名为《计算机科学原理》的书(由Schaum的提纲出版)。 第二章以顺序搜索示例介绍算法,该搜索简单地循环访问名称列表,如果在列表中找到给定名称,则返回TRUE。 作者继续说(第17页): 我们说顺序搜索算法的“增长顺序”是n。表示为T(n)。我们还说,增长顺序在T(n)的某个恒定因子之内的算法具有NLsay的theta。“顺序搜索的n为n。” 问题的大小为n,即要搜索的列表的长度。 我发现这确实很难遵循。这本书到处都是错误,所以我不确定是我遗漏了什么还是上面的段落中有错字。一般来说,我很少看到以“ ... say”结尾的句子。 我很困扰。 T代表什么?这本书没有解释。是时间还是Theta? 如果“ NL的theta”表示“顺序搜索的n为n”。L代表什么?“线性”还是“长度”? 我已写信给出版商,要求解释。他们说他们会将我的信息转发给作者。他们没有回答。我也尝试过查看其他资源,但仍然感到the惑,觉得我误会了一些东西,因此,在我对本段进行解码之前,请不要放松。 如果有人拥有该书的副本,并且已经理解该段落。然后,如果您能让我知道该段是否正确或用其他方式解释,将不胜感激。谢谢。

10
O(·)不是一个函数,那么一个函数如何等于它呢?
我完全理解大ØOO符号的含义。我的问题是,当我们说Ť(n )= O (f(n ))T(n)=O(f(n))T(n)=O(f(n)),其中Ť(n )T(n)T(n)是大小为ñnn输入上算法的运行时间。 我了解它的语义。但是Ť(n )T(n)T(n)和Ø (˚F(n ))O(f(n))O(f(n))是两回事。 Ť(n )T(n)T(n)是一个精确的数字,但是Ø (˚F(n ))O(f(n))O(f(n))不是一个产生数字的函数,因此从技术上讲我们不能说Ť(n )T(n)T(n) 等于 Ø (˚F(n ))O(f(n))O(f(n))。您 O (f (n ()))的值是多少,答案是什么?没有答案。Ø (˚F(n ))O(f(n))O(f(n))

5
为什么有这么多基于文本的互联网协议?
从我发现,一个非常大的量的协议的旅行在互联网上是“基于文本的”,而不是二进制。有问题的协议包括但不限于HTTP,SMTP,FTP(我认为这是全部基于文本的协议),WHOIS,IRC。 实际上,这些协议中的某些协议每当要传输二进制数据时都会跳入某些循环。 这背后有原因吗?基于文本的协议显然会带来一些开销,因为它们需要发送更多的数据来传输相同数量的信息(请参见下面的示例)。有什么好处胜过这个? 通过基于文本的,我的意思是大多数协议中使用的字符是之间0x20(空间)和0x7E(~),与用于偶尔“字调校妥当,” 非常特殊的用途,如换行,空,ETX和EOT。这与通过连接传输原始二进制数据相反。 例如,将整数123456作为文本传输将涉及发送字符串123456(以十六进制表示为31 32 33 34 35 36),而将32位二进制值发送为(以十六进制表示)0x0001E240(如您所见,“包含”特殊的空字符) 。

8
变量如何存储在程序堆栈中以及如何从程序堆栈中检索?
提前为这个问题的幼稚表示歉意。我是位50岁的艺术家,这是我第一次真正地正确理解计算机。所以去了。 我一直在尝试了解编译器如何处理数据类型和变量(从非常普遍的意义上讲,我知道有很多事情要做)。我对“堆栈”中的存储与值类型之间的关系以及“堆”中的存储与引用类型之间的关系的理解中缺少一些东西(引号旨在表示我理解这些术语是抽象的,而不是抽象的在像我构想此问题的方式这样的简化上下文中太夸张了。无论如何,我的简单想法是布尔值和整数之类的类型都放在“堆栈”上,因为它们可以存储,因为它们在存储空间方面是已知的实体,并且可以轻松地控制它们的范围。 但是我没有得到的是应用程序随后如何读取堆栈上的变量-如果我声明并分配x为整数,例如x = 3,并且存储在堆栈上保留,然后将其值3存储在堆栈中,然后在我声明和分配的功能与相同y,例如4,然后x在另一个表达式中使用(例如z = 5 + x),该程序如何读取x以便评估z何时在下面y在堆栈上?我显然缺少了一些东西。是不是堆栈上的位置仅与变量的生存期/范围有关,并且整个堆栈实际上始终可以被程序访问?如果是这样,是否意味着还有其他索引仅保留堆栈上变量的地址以允许检索值?但是后来我认为堆栈的全部目的是将值与变量地址存储在同一位置?在我微弱的头脑中,似乎还有其他索引,那么我们在谈论的更像是堆吗?我显然很困惑,我只是希望对我的简单问题有一个简单的答案。 感谢您阅读本文。

4
为什么红黑树如此受欢迎?
在我看来,似乎到处都在使用红黑树(std::set在C ++,SortedDictionaryC#等中)实现数据结构。 在我的算法课程中刚刚覆盖了(a,b),红黑和AVL树之后,这就是我的收获(也是从问问教授,翻阅几本书并仔细研究一下)得出的: AVL树的平均深度小于红黑树,因此在AVL树中搜索值的速度始终更快。 与AVL树相比,红黑树进行结构调整以平衡自身的可能性要小一些,这可能会使它们的插入/删除速度更快。我可能会说,因为这将取决于对树的结构更改的成本,因为这将在很大程度上取决于运行时和隐含(当树是不可变的时,功能语言是否也可能完全不同?) 网上有很多基准可以比较AVL和红黑树,但令我惊讶的是,我的教授基本上说过,通常您会做以下两件事之一: 要么您根本就不在乎性能,在这种情况下,大多数情况下AVL与Red-black的10-20%的差异根本不重要。 或者,您真的很在乎性能,在这种情况下,您会抛弃AVL树和红黑树,并选择B树,可以对B树进行调整以使其工作得更好(或(a,b)树),我将所有这些都放在一个篮子里。) 这样做的原因是因为B树将数据更紧凑地存储在内存中(一个节点包含许多值),因此缓存未命中的情况将大大减少。您还可以根据用例来调整实现,并使B树的顺序取决于CPU缓存大小等。 问题在于,我几乎找不到任何可以分析现实硬件上不同实现的搜索树实际使用情况的资源。我浏览过许多有关算法的书,但没有发现可以将不同的树变体进行比较的任何东西,除了表明一棵树的平均深度比另一棵树小(这并没有真正说明树的行为方式)在实际程序中。) 话虽这么说,是否有一个特定的原因为什么到处都使用红黑树,而根据上述内容,B树应该胜过它们?(作为唯一的基准测试,我还可以看到http://lh3lh3.users.sourceforge.net/udb.shtml,但这可能只是具体实现的问题)。还是为什么每个人都使用Red-black树是因为它们很容易实现,或者换句话说,很难实现不好呢? 另外,当人们进入功能语言领域时,这将如何改变?似乎Clojure和Scala都使用Hash数组映射的trys,其中Clojure使用32的分支因子。

9
是否存在带有提取的优先级队列?
有很多数据结构实现了优先级队列接口: 插入:将元素插入结构 Get-Min:返回结构中的最小元素 Extract-Min:删除结构中的最小元素 实现此接口的常见数据结构是(min)堆。 通常,这些操作的(摊销)运行时间为: 插入:(有时)O(log n )O(1 )O(1)\mathcal{O}(1)O(对数n )O(log⁡n)\mathcal{O}(\log n) Get-Min:O(1 )O(1)\mathcal{O}(1) 提取最小值:O(对数n )O(log⁡n)\mathcal{O}(\log n) 例如,斐波那契堆可达到这些运行时间。现在,我的问题是: 是否存在具有以下(摊销)运行时间的数据结构? 插入:O(对数n )O(log⁡n)\mathcal{O}(\log n) Get-Min:O(1 )O(1)\mathcal{O}(1) 提取最小值:O(1 )O(1)\mathcal{O}(1) 如果我们可以在给定排序输入的情况下在时间内构造这样的结构,那么我们可以例如在比使用“通常”优先级队列的路口快得多。o (nO(n )O(n)\mathcal{O}(n)ø (Ñ日志ñ)o(nlog⁡n)o\left(\frac{n}{\log n}\right)

7
在多核CPU上必须做些什么?
当考虑我们的程序必须具有多线程友好性时,我的团队对是否有绝对不能在单核CPU上完成的事情感到困惑。我认为图形处理需要大量的并行处理,但是他们认为像DOOM这样的事情是在没有GPU的单核CPU上完成的。 有什么,必须在多核心处理器做什么? 假设开发和运行都有无限的时间。


2
要找到未排序数组的中位数,我们可以在n 个元素的时间内进行最小堆操作,然后可以以n / 2个元素中的一个来提取一个中值。但是这种方法将花费O (n log n )时间。Ø (ñ 日志n )O(nlog⁡n)O(n\log n)ñnnn / 2n/2n/2Ø (ñ 日志n )O(nlog⁡n)O(n \log n) 我们可以在时间内通过某种方法执行相同操作吗?如果可以,那怎么办?O (n )O(n)O(n)

2
Y组合器如何举例说明“ Lambda演算不一致”?
在定点组合器的Wikipedia页面上,写着相当神秘的文字 Y组合器是导致Lambda微积分不一致的一个示例。因此,应该怀疑。但是,仅在数学逻辑中定义时考虑Y组合器是安全的。 我读过某种间谍小说吗?“ -calculus”是“不一致的”并且应该“被怀疑”的说法在世界上意味着什么?λλ\lambda

7
最小生成树与最短路径
最小生成树算法和最短路径算法有什么区别? 在我的数据结构课程中,我们介绍了两种最小生成树算法(Prim和Kruskal)和一种最短路径算法(Dijkstra)。 最小生成树是图形中跨越所有顶点的树,并且树的总权重最小。最短路径很明显,它是从一个顶点到另一个顶点的最短路径。 我不明白的是,由于最小生成树的总权重最小,树中的路径不是最短的路径吗?有人可以解释我所缺少的吗? 任何帮助表示赞赏。

2
是什么意思?
这是一个基本问题,但是我认为与,因为在我们趋于无穷大时,较大的项应该起主导作用?同样,这将不同于O(\ min(m,n))。那正确吗?我一直看到这种表示法,尤其是在讨论图形算法时。例如,您通常会看到:O(| V | + | E |)(例如,参见此处)。O(m+n)O(m+n)O(m+n)O(max(m,n))O(max(m,n))O(\max(m,n))O(min(m,n))O(min(m,n))O(\min(m,n))O(|V|+|E|)O(|V|+|E|)O(|V| + |E|)

3
无向树中只有一个遍历的最长路径
有两种使用深度优先搜索的标准算法来查找无向树中的最长路径: 从随机顶点开始DFS 并找到离它最远的顶点;说是。vvvv′v′v' 现在从开始DFS,以找到离它最远的顶点。该路径是图中的最长路径。v′v′v' 问题是,这可以更有效地完成吗?我们可以用一个DFS或BFS做到吗? (这可以等效地描述为计算无向树的直径的问题。)

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.