计算机科学

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

3
香农熵为0.922,三个不同的值
给定一串值AAAAAAAABCAAAAAAAABCAAAAAAAABC,对数基数222的Shannon熵 为0.9220.9220.922。据我了解,在基数 222,向上舍入的Shannon熵是二进制中代表单个值之一的最小位数。 摘自此维基百科页面上的介绍: https://en.wikipedia.org/wiki/Entropy_%28information_theory%29 那么,如何用一位来表示三个值呢?AAA 可以是 111,BBB 可以是 000 ; 但是你怎么代表 CCC? 先感谢您。

3
纯粹为功能编程设计的CPU有何不同?
在一定程度上,CPU在设计时会考虑人们会为它隐式或显式编写的软件。 在我看来,如果您看一下指令集体系结构的设计,就每个指令编码一个命令式样式命令的意义而言,它们是非常“必要的”。在我看来,当前的指令集架构在某种程度上是基于程序员产生的代码类型而发展的。 如果一个人从头开始设计CPU,并且知道它只会运行以功能编程风格编写的程序,那么该CPU的设计将与现有CPU有何不同?

2
该程序会为每个整数终止吗?
在GATE准备的零件测试中,存在一个问题: f(n): if n is even: f(n) = n/2 else f(n) = f(f(n-1)) 我回答“它将终止于所有整数”,因为即使对于某些负整数,它将终止为Stack Overflow Error。 但是我的朋友不同意说,由于这不是实现的代码,而只是伪代码,因此在某些负整数的情况下将是无限递归的。 哪个答案正确,为什么?

1
如果虚拟地址空间可以大于物理地址空间,那么地址映射如何存储在内存中?
假设我们正在使用具有40个物理地址位的系统。物理地址总空间(假定字节可寻址内存)为字节,即1 TiB。而且,如果虚拟地址的长度为48位,则意味着虚拟内存可用的地址比物理内存中的地址要多。2402402^{40} 这对我来说很有意义,因为“多余”地址也可能指向硬盘位置。但是,我不了解虚拟地址和物理地址之间的转换是如何发生的。我假设有一个映射存储在某处,该映射将VAS位置链接到物理位置。如果虚拟地址位置多于物理地址,那么如何将所有这些映射存储在内存中?至少需要48位来存储每个虚拟地址,然后再需要40位来存储其映射到的物理位置。因此,显然,您不能仅存储每个虚拟地址与其物理对应物的1:1映射,因为映射每个位置将比物理内存本身占用更多的内存。 我在这里到底想念什么?


2
基于堆栈的编程语言是否可以并发?
我一直在阅读有关基于堆栈的编程语言(例如FORTH和Cat),并且看来,鉴于它们的性质,无论它们的范例如何,它们一次只能执行一个动作(FORTH是必不可少的,而Cat是功能性的)。 命令式语言将修改堆栈,而纯功能性语言(如Joy)将返回新堆栈,但要点是一次只能使用一个堆栈。 那么,基于堆栈的编程语言可以并发吗?他们可以通过同时使用多个堆栈或类似方式来实现并发吗? 是否可以在基于堆栈的编程语言中实现惰性评估? 如果我对上述语言和概念有误解,请纠正我

2
在lambda演算中求解未知函数的函数方程
是否有任何技术可以解决lambda微积分中未知函数的函数方程? 假设我具有如下扩展定义的标识函数: Ix=xIx=xI x = x (即,为该函数的预期行为写下一个方程式),现在我想通过做一些代数变换来获得该函数的内涵式来为解决它:III I=λx.xI=λx.xI = \lambda x.x 告诉我们该函数如何精确地完成预期的工作(即,如何在lambda演算中实现它)。 当然,仅以身份功能为例。我对解决此类方程式的更通用方法感兴趣。特别是,我想找到一个满足以下要求的函数BBB: 乙F(λ X 。中号)= (λ X 。˚F中号)乙F(λX。中号)=(λX。F中号)B\;f\;(\lambda x.M) = (\lambda x.f M) 也就是说,将给定函数插入给定的lambda函数,使其位于其“ body”(它是任意的lambda表达式)之前,可能是通过拆开并构造一个新的函数,使其变为函数应用于的参数。FFf(λ X 。中号)(λX。中号)(\lambda x.M)中号中号MFFf

1
可以提高计算机编程能力的数学主题或领域?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 通常,在算法和计算机编程方面,数学家或具有数学背景的计算机程序员都非常优秀。 我不是在说什么: 数学需要成为一个好的计算机程序员。数学是编程所必需的。好的数学家是好的程序员,反之亦然 我在说什么 我想学习一些数学,因为我相信它将使我成为一个更好的程序员。哪些数学领域/主题将帮助我成为更好的程序员?形式的答案math topic - corresponding cs area将不胜感激。 注意:我在StackOverflow上问过这个问题,它被宣布为题外话。我想在业余时间学习计算机编程一样的方法。提前致谢。


2
缺点的什么性质可以消除尾部递归模缺点?
我熟悉基本尾部递归消除的概念,其中可以将返回调用自身直接结果的函数重写为迭代循环。 foo(...): # ... return foo(...) 我还了解,在特殊情况下,如果将递归调用包装在对的调用中,则仍然可以重写该函数cons。 foo(...): # ... return (..., foo(...)) 的什么性质cons允许?除了cons可以包装递归尾部调用而又不破坏我们迭代重写的功能之外,还有哪些功能呢? GCC(但不是Clang)能够优化 “尾递归模乘 ”的示例,但是尚不清楚哪种机制可以发现它或如何进行转换。 pow(x, n): if n == 0: return 1 else if n == 1: return x else: return x * pow(x, n-1)

7
为什么NFA被称为不确定性?
我想到了这个(有点有趣)的问题。当我们定义输入的转换时,为什么不确定性有限自动机称为非确定性自动机。好吧,即使存在多个和ε过渡,也定义了它们,这意味着机器对于这些过渡是确定的。这意味着它是确定性的。

3
没有数组的记忆
在Cormen等人的“算法简介”中,第15.3节动态编程的元素对记忆的解释如下: 记忆的递归算法为每个子问题的解决方案在表中维护一个条目。每个表条目最初都包含一个特殊值,以指示该条目尚未填写。当递归算法展开时,第一次遇到子问题时,将计算其解决方案,然后将其存储在表中。以后每次遇到此子问题时,我们只需查找表中存储的值并返回它。 并且添加了一个脚注: 这种方法的前提是我们知道所有可能的子问题参数的集合,并且已经建立了表位置和子问题之间的关系。另一种更通用的方法是通过使用以子问题参数作为键的哈希来记忆。 是否有任何众所周知的DP问题需要(或使其更容易)将已存储的值存储在字典中,而不是在(多维)数组中? 背景:如果有什么用,这个问题的原因是我正试图将(自平衡)二进制搜索树的概念激发给刚刚看过动态编程的人们。

2
空字符串的λ的起源是什么?
我通常在空字符串(空词或空字符串)中使用符号。但是我知道有些人使用λ而不是ε。εε\varepsilonλλ\lambdaεε\varepsilon 我认为源自“空”一词。但是我不知道λ的起源。εε\varepsilonλλ\lambda 在自动机理论中,存在自动机的ε跃迁,也被称为lambda跃迁。例如,默认情况下,JFLAP软件使用作为epsilon过渡的标签。λλ\lambda 我在起源上进行了搜索,并搜索了cs.stackexchange,但找不到。有谁知道描述这个的参考?

5
如何找到最大集合元素的
我有一个算法问题。 TŤTnñnSSSTTTa∈Sa∈Sa\in Sa⩾|S|a⩾|S|a\geqslant |S| 例如: 如果 = [1、3、4、1、3、6],则可以为[3、3、6]或[3、4、6]或[4、3、6]。TTTSSS 在 = [7,5,1,1,7,4]中,则为[7,5,7,4]。小号TTTSSS 我已经尝试过此递归函数。 function(T): if minimum(T) >= length(T): return T else: return function(T\minimum(T)) 是否有任何非递归算法。(我没有检查我的递归算法,所以它可能有一些缺陷。)


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.