计算机科学

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



2
为什么增加对数概率比相乘概率快?
为了解决这个问题,在计算机科学中,我们经常要计算以下几种概率的乘积: P(A,B,C) = P(A) * P(B) * P(C) 最简单的方法就是将这些数字相乘,这就是我要做的。但是,老板说最好添加概率的日志: log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C)) 这给出了对数概率,但是如果需要,我们可以在以后获得概率: P(A,B,C) = e^log(P(A,B,C)) 日志添加被认为更好,原因有两个: 它防止“下溢”,因为下溢的概率乘积如此之小,以至于四舍五入为零。由于概率通常很小,因此这通常是一种风险。 它之所以快,是因为许多计算机体系结构执行加法的速度比乘法快。 我的问题是关于第二点。这就是我所看到的描述方式,但是没有考虑获取日志的额外费用!我们应该将“原木成本+加成成本”与“乘法成本”进行比较。考虑到这一点,它还会变小吗? 同样,Wikipedia页面(对数概率)在这方面令人困惑,指出“转换为对数格式很昂贵,但是只发生一次。” 我不明白这一点,因为我认为您需要在添加之前独立记录每个术语的日志。我想念什么? 最后,“计算机执行加法的速度比乘法快”的说法有点含糊。这是特定于x86指令集的,还是处理器体系结构的一些更基本的特征?


6
在O(n)时间中:在不传递比较的集合中找到最大元素
标题说明了问题。 作为输入,我们可以比较一个元素列表(确定最大)。没有元素可以相等。 关键点: 比较不是传递性的(想像石头剪刀布):这可能是正确的:A> B,B> C,C> A (请注意,这不是有效的输入,因为此处没有有效的答案,我仅描述“非及物比较”) 每个输入数组将保证有一个答案 最大表示元素必须大于其他所有元素 拥有逆属性,即A> B表示B <A 例: Input: [A,B,C,D] A > B, B > C, C > A D > A, D > B, D > C Output: D 我无法找出在O(n)时间内完成此操作的方法,我最好的解决方案是O(n ^ 2)。 因为要确定答案,所以必须将每种元素与其他所有元素进行显式比较,以证明它确实是答案(因为比较不是可传递的),因此我对每种方法都感到困惑。 这排除了堆的使用,排序等。

3
尽管我们不知道它是什么,但是是否存在可证明存在的算法?
在数学中,有许多非构造性的存在证明,因此我们知道某个对象存在,尽管我们不知道如何找到它。 我正在计算机科学领域寻找类似的结果。特别是:是否存在一个问题,我们可以证明它是可判定的而无需显示算法?也就是说,我们知道可以通过算法解决,但是我们不知道算法是什么样的?

7
为什么许多相似的png图像的这些(无损)压缩方法无效?
我碰到了以下事情:我将png图像的多个相同副本放入文件夹中,然后尝试使用以下方法压缩该文件夹: tar czf folder.tar.gz folder/ tar cf folder.tar folder/ && xz --stdout folder.tar > folder.tar.xz (这对于相同的图像效果很好,但是对于相似的图像,增益为零) zip -r folder.zip folder/ 当我检查的大小.tar.gz,.tar.xz,.zip我意识到,这是几乎相同的一个folder/。 我了解png图像本身可能具有很高的压缩率,因此无法进一步压缩。但是,当将许多相似(在这种情况下甚至相同)的png图像合并到存档中,然后压缩存档时,我希望所需的大小会显着减小。在相同的图像的情况下,我期望的尺寸大约是单个图像的尺寸。


8
是否每个数据类型都可以归结为带有指针的节点?
数组或向量只是一系列值。它们肯定可以通过链表实现。这只是一堆带有指向下一个节点的指针的节点。 堆栈和队列是Intro CS课程中通常教授的两种抽象数据类型。在课堂上的某个地方,学生通常不得不使用链接列表作为基础数据结构来实现堆栈和队列,这意味着我们回到了相同的“节点集合”的想法。 可以使用堆创建优先级队列。堆可以看作是一棵以最小值为根的树。各种树(包括BST,AVL,堆)都可以看作是由边连接的节点的集合。这些节点链接在一起,其中一个节点指向另一个节点。 似乎每个数据概念总是可以归结为仅带有指向其他某个适当节点的指针的节点。那正确吗?如果这么简单,为什么教科书不解释数据仅仅是一堆带有指针的节点呢?我们如何从节点转到二进制代码?

2
类别理论(不是)用于编程?
在学习了Haskell和其他不是那么纯正的FP语言之后,我决定阅读有关类别理论的文章。在对分类理论有了很好的理解之后,我开始思考如何将分类理论的概念用于设计程序,但是无论我多么努力,这似乎都不是路要走。 在花了许多不成功的尝试将类别理论与设计程序联系起来之后,我得出以下结论: 类别理论在设计编程语言时很有用。 在设计程序时(甚至在使用基于类别原理设计的语言时)也不需要使用类别理论。例如:在Haskell中进行编程时,您将使用类型,类型构造函数,函数,高阶函数等来设计程序,而不是类别理论概念。 总而言之,我们有下层系统(顺序从低到高): 范畴论->编程语言->程序 在特定的层上,使用直接基础层的概念。 这种理解正确吗?如果不是这样,并且您认为在设计程序时我们可以直接使用类别理论的概念,请参阅一些论证该文章的文章或博客文章。 注意:通过设计程序,我的意思是基于不同的概念来设计程序,例如并发,并行,响应式,消息传递等。

5
可以通过转义更高级的计算描述来“解决”停止问题吗?
我最近听到一个有趣的类比,其中指出图灵关于停顿问题的不确定性的证明与拉塞尔的理发师悖论非常相似。 所以我想知道:数学家最终确实设法通过从Cantor朴素的领域表述过渡到更复杂的公理系统(ZFC集合论)(在此过程中进行了重要的排除(约束)和加法)使集合论保持一致。 因此,也许有可能尝试并提出一种比图灵机更强大,更具表现力的通用计算的抽象描述,通过这种抽象描述,既可以得到存在的证明,甚至可以找到一种算法来解决以下问题:一台任意的图灵机?

9
在给定公平硬币的情况下如何模拟骰子
假设给了您一个公平的硬币,并且您想模拟重复翻转一个公平的(六面)骰子的概率分布。我最初的想法是,我们需要选择适当的整数,使2 k = 6 m。所以翻转硬币后ķ倍,我们通过将范围映射由第k比特串长度到管芯的输出编码数[ 0 ,2 ķ - 1 ]每个的长度为6个的间隔米。但是,这是不可能的,因为2 k仅有两个素数,但2 k的素数ķ ,米k,mk,m2ķ= 6 米2k=6m2^k = 6mķkk[ 0 ,2ķ− 1 ][0,2k−1][0,2^k-1]米mm2ķ2k2^k包括3。应该有其他简单的方法来执行此操作,对吗?6 米6m6m

2
“子产品”问题NP是否完整?
子集和问题是经典的NP完全问题: 给定一个数字和一个目标k的列表,是否有一个L的数字子集加起来等于k?大号LLķkk大号LLķkk 一个学生问我这个称为“子集产品”问题的变体是否是NP完全的: 给定一个数字和一个目标k的列表,是否有L个数字的子集,乘积为k?大号LLķkk大号LLķkk 我进行了一些搜索,但是找不到任何有关此问题的资源,尽管也许我错过了。 子产品问题NP是否完整?

12
在不使用计算机的情况下如何教授计算机科学?
在世界上的某些地方,人们通常无法访问计算机(因而对计算机知之甚少),即使可以使用,硬件和软件也已过时,并且由于停电等原因而使使用受到困扰。也往往缺少对(好)书的访问。在这种情况下如何教授计算机科学? 我担心如果无法进行实验并运用所学知识,他们将根本无法学习(好),即使他们的动机非常强烈,并且将大部分时间都花在了这个爱好上。是否可以仅在理论上讲授CS?
21 education 

5
函数编程之外的Lambda演算?
此问题是从理论计算机科学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 我是一名大学生,我们目前正在研究Lambda微积分。但是,我仍然很难理解为什么这对我有用。我意识到,如果您进行大量的函数编程,它可能会很有用,但是我认为学习函数式编程并不需要它,您认为呢? 其次,Lambda微积分在计算机科学领域内但在函数式编程语言之外是否有用?

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.