计算机科学

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

4
排序(排序)5个元素所需的比较次数最少
找到排序(排序)五个元素所需的最少数量的比较,并设计一种算法,使用该数量的比较对这些元素进行排序。 解决方案:有5个!= 120个可能的结果。因此,用于排序过程的二叉树将至少具有7个级别。事实上, ≥120意味着≥7.但7比较是不够的。排序(排序)五个元素所需的最少比较次数是8。2h2h2^hhhh 这是我的实际问题:我确实找到了可以在8次比较中完成的算法,但是如何证明在7次比较中无法完成?

1
do-while循环足以满足图灵完整性吗?
我知道,在命令式编程语言中,while-do循环足以构成使图灵完成的语言的控制流构造(就控制流而言,当然,我们还需要无限制的内存和某些运算符...) 。我的问题的要点是:do-while循环是否具有与while-do-循环相同的计算能力?换句话说,如果不可能完全跳过指令,那么一种语言可以是图灵完备的吗? 我意识到这里的某些语义可能有点模棱两可,所以让我用一个特定的例子来表达实际问题: Brainfuck(BF)是一个图灵tarpit,其中唯一的控制流是while-do循环,表示为[...](问题的底部有一个完整的语言规范,以防您不熟悉Brainfuck。让我们定义一种新的语言BF *,它,.+-<>的语义与BF中的语义相同,但是代替它的[]是{},它具有do-while循环。也就是说,与BF的唯一区别是每个循环至少可以执行一次,然后才能跳过进一步的迭代。 BF *图灵完成了吗?如果是这样,我会对如何将BF转换为BF *感兴趣。如果不是,我该如何证明? 我自己的一些观察: 并非每个BF程序都可以转换为BF *。例如,不可能用BF *编写可能会或可能不会读取或打印值的程序-如果该程序可能打印一个或多个值,它将始终打印至少一个。但是,可能存在BF的图灵完备子集,可以将其转换为BF *。 我们不能简单地将[f](f仅由组成的任意Brainbrauck程序翻译成+-[]<>)(以消除第一次迭代的效果),因为a)并非每个可计算的函数都具有可计算的逆,并且b)即使有,循环次数不一定会比因此少,因此不能保证首先递归地执行此步骤。f-1{f}f-1f 这是Brainfuck语言的快速概述。Brainfuck在无限磁带上操作,其中每个单元包含一个字节值,最初为零。溢出会回绕,因此增加255可得到0,反之亦然。该语言包含8条指令: + Increment the current cell. - Decrement the current cell. > Move tape head to the right. < Move tape head to the left. , Input a character from STDIN into the current cell. . …

11
为什么
我想知道是否有规则证明这一点。例如,如果我用分配律我将只得到。(甲∨ 甲)∧ (甲∨ ¬ 乙)(A∨A)∧(A∨¬B)(A \lor A) \land (A \lor \neg B)

3
给定体积以最小化表面积的算法
考虑以下算法任务: 输入:一个正整数nnn,连同它的因式分解 查找:正整数x,y,zx,y,zx,y,z,最大限度地减少xy+yz+xzxy+yz+xzxy+yz+xz,受到了限制xyz=nxyz=nxyz=n 这个问题的复杂性是什么?有多项式时间算法吗?是NP难吗? 这个问题基本上是在问:在体积为nnn,尺寸均为整数的所有矩形实体中,表面积最小的是哪一个? 这个问题是由丹·迈耶(Dan Meyer)提出的,题为“ 1,000名数学老师无法解决的数学问题”。到目前为止,与他一起工作的数学老师都没有找到解决这个问题的合理算法。在他的上下文中,“合理”的定义有点不精确,但是作为计算机科学家,我们可以提出一个关于此问题的复杂性的更精确的问题。 显而易见的方法是枚举所有可能性x,y,zx,y,zx,y,z,但这需要花费指数时间。丹·迈尔(Dan Meyer)博客的评论者提出了许多有效的候选算法,不幸的是,所有这些算法都被证明是不正确的。马丁·斯特劳斯( Martin Strauss)表示,这个问题似乎让人联想到3分区,但我看不到这种减少。 让我也清除一些我在评论/答案中看到的误解: 不能从3分区通过简单地更换每个数字减少qqq与其功率2q2q2^q,由于这两个问题的目标函数是不同的。明显的减少根本行不通。 最优解涉及选择x,y,zx,y,zx,y,z中的一个作为nnn与3的最接近除数是不正确的√n−−√3n3\sqrt[3]{n}。我看到多个人都认为情况确实如此,但实际上这是不正确的。Dan Meyer博客文章已对此进行了证实。例如,考虑n=68n=68n=68;68−−√3≈4683≈4\sqrt[3]{68} \approx 4和4将68,所以你可能会认为,至少一个x,y,zx,y,zx,y,z应为4; 但是,这是不正确的。最佳解是x=2x=2x=2,y=2y=2y=2,z=17z=17z=17。另一个反是n=222n=222n=222,222−−−√3≈62223≈6\sqrt[3]{222}\approx 6,但最佳的解决方案是x=37X=37x=37,y=3ÿ=3y=3,z=2ž=2z=2。(这可能是真实的,对于所有nñn,最优解决方案涉及制造在至少一个x,y,zX,ÿ,žx,y,z等于任一的最小除数nñn大于n−−√3ñ3\sqrt[3]{n} 或最大除数nñn小于n−−√3ñ3\sqrt[3]{n}我现在没有反例-但是如果您认为这句话是正确的,那就需要证明。您绝对不能认为这是真的。) “使的大小相同”似乎并不一定在所有情况下都能产生最佳答案。有关反例,请参见Dan Meyer的博客文章。或者,至少对于短语“使其大小大致相同”的一些合理解释,有一些反例表明该策略实际上并不是最佳的。如果您想尝试某种策略,请确保您准确地声明索赔,然后提供仔细的数学证明。x,y,zX,ÿ,žx,y,z 运行时间不是多项式。为了使该问题出现在P中,运行时间必须是输入长度的多项式。输入的长度类似于lg n,而不是n。可以使明显的蛮力算法在O (n 3)或O (n 2)时间中运行,但是在lg n中是指数式的,因此算作指数时间算法。因此,这没有帮助。O(n3)Ø(ñ3)O(n^3)lgnlg⁡ñ\lg nnñnO(n3)Ø(ñ3)O(n^3)O(n2)Ø(ñ2)O(n^2)lgnlg⁡ñ\lg n

5
使用质数进行数据压缩
我最近偶然发现了以下有趣的文章,该文章声称无论数据的类型和格式如何,始终有效地将随机数据集压缩超过50%。 基本上,它使用质数唯一地构造4字节数据块的表示形式,由于每个数字都是质数的唯一乘积,因此易于解压缩。为了使这些序列与质数相关联,它利用字典。 我的问题是: 正如作者建议的那样,这真的可行吗?根据该论文,它们的结果非常有效,并且始终将数据压缩为较小的大小。字典的大小会不会很大? 难道不能使用同一算法来迭代地重新压缩压缩数据吗?很明显,并且已经证明,这种技术(压缩的数据被尽可能多地重新压缩,从而大大减小了文件的大小)是不可能的。实际上,在所有随机数据的集合和压缩数据之间不会存在双射。那么为什么会有这种感觉呢? 即使该技术尚不完善,也显然可以对其进行优化和大力改进。为什么没有对此进行更广泛的了解/研究?如果确实这些主张和实验结果是正确的,那么这将不会给计算带来革命性的变化?

7
一个在两个数组中不同的元素。如何有效地找到它?
我正在准备进行编码面试,但我真的想不出解决此问题的最有效方法。 假设我们有两个数组,这些数组由未排序的数字组成。数组2包含一个数字,数组1没有。两个数组都有随机定位的数字,不一定以相同的顺序或相同的索引。例如: 阵列1 [78,11,143,84,77,1,26,35 .... n] 数组2 [11,84,35,25,77,78,26,143 ... 21 ... n + 1] 找到不同数字的最快算法是什么?它的运行时间是多少?在此示例中,我们要查找的数字是21。 我的想法是遍历数组1并从数组2中删除该值。迭代直到完成。这应该在O(nlogn)O(nlog⁡n)O(n \log n)运行时间左右,对吗?

4
是否没有具有所有特定所需属性的排序算法?
在Sorting Algorithms网站上,提出以下索赔: 理想的排序算法将具有以下属性: 稳定:相同的键不会重新排序。 在原地运行,需要额外空间。O(1)O(1)O(1) 最坏情况键比较。O(n⋅lg(n))O(n⋅lg⁡(n))O(n\cdot\lg(n)) 最坏情况下的交换。O(n)O(n)O(n) 自适应:当数据接近排序或唯一键很少时,速度最高可达。O(n)O(n)O(n) 没有具有所有这些属性的算法,因此排序算法的选择取决于应用程序。 我的问题是 没有具有所有这些属性的[sorting]算法 如果是这样,为什么?这些属性的原因是什么使得它们同时无法实现?

3
为什么NP完全问题在近似上如此不同?
首先,我想说我是一名程序员,而我在复杂性理论方面没有很多背景。 我注意到的一件事是,尽管许多问题都是NP完全的,但是当扩展到优化问题时,有些问题比其他问题难得多。 一个很好的例子是TSP。尽管所有类型的TSP都是NP完全的,但通过连续的简化,相应的优化问题变得越来越容易。一般情况是NPO完全,度量情况是APX完全,而欧几里得情况实际上具有PTAS。 这对我来说似乎违反直觉,我想知道是否有这个原因。

1
可确定推断的最强大的已知类型系统是什么?
众所周知,Hindley-Milner类型推断(具有多态性的简单类型的演算)具有可确定的类型推断:您可以为任何程序重建原理类型而无需任何注释。λλ\lambda 添加哈斯克尔风格类型类似乎保留此可判定性,但进一步增加使得推理没有标注不可判定的(类型的家庭,GADTs,依赖类型,等级-N类型,系统等)ωω\omega 我想知道:最能断定推断的已知类型系统是什么?它会介于Hindley-Milner(完全可确定)和依赖类型(完全不可确定)之间。是否可以添加DT的某些方面来保持推理可判定性?已经进行了哪些研究以了解可以将其推进多远? 我意识到,没有一个最强大的系统,可能有无限的微小增量变化可以添加到HM保持推理中。但是可能已经发现了一些实用的系统候选对象。 编辑:因为没有“最强”的系统,我会接受,勾勒出一个答案显着扩展辛德雷米尔纳与可判定的推理系统。例如液体类型,等级2等。

5
为什么图灵功能语言完整?
也许我对这个主题的有限理解是错误的,但这是我到目前为止所了解的: 函数式编程基于Alonzo Church制定的Lambda微积分。 命令式编程基于教会学生Alan Turing制作的Turing机器模型。 Lambda演算的功能和图灵机一样强大, 这意味着它们的计算能力相当。 如果函数式编程基于Lambda演算而不是Turing机器,那么为什么其中某些(或全部)描述为Turing完整,而不是Lambda完整或类似的东西?“图灵完备性”一词在图灵机上是否有任何特殊之处,还是仅此一个词? 最后,如果命令式语言基于Turing Machine,而计算机基本上是Turing计算机,没有无限的内存,这是否意味着它们在我们现代PC上的性能优于功能编程语言? 如果是这样的话,那么lambda演算机器的等效条件是什么? 我知道这似乎是3个独立的问题,但它们都是紧密相关的,并且每个问题都取决于前一个问题是否是有效的问题。

3
将(数学)问题转换为SAT实例
我想要做的是将我遇到的一个数学问题转换为布尔可满足性问题(SAT),然后使用SAT解算器进行求解。我想知道是否有人知道手册,指南或任何可以帮助我将问题转换为SAT实例的内容。 另外,我想在比指数时间内更好的解决这个问题。我希望SAT解算器能对我有所帮助。

2
分而治之的理论基础
在算法设计方面,通常采用以下技术: 动态编程 贪婪策略 分而治之 尽管对于前两种方法,有著名的理论基础,即Bellman最优性原理和拟阵理论(分别是Greedoid),但我找不到基于D&C的算法通用框架。 首先,我知道我们(或更确切地说,教授)在函数式编程类中引入的某种东西,称为“算法框架”,它是在组合器的上下文中产生的。作为示例,我们为D&C算法提供了如下框架: 定义:令为非空集。我们称解的元素,而的元素(即的子集)称为问题。然后,D&C骨架为4元组,其中:A,SA,SA,SSSS P:=P(A)P:=P(A)P:=\mathfrak{P}(A)AAA(Pβ,β,D,C)(Pβ,β,D,C)(P_\beta, \beta, \mathcal{D}, \mathcal{C}) PβPβP_\beta是在一系列问题的谓词和我们说一个问题是基本的当且仅当成立。pppPβ(p)Pβ(p)P_\beta(p) ββ\beta是映射,为每个基本问题分配解决方案。Pβ→SPβ→SP_\beta \rightarrow S DD\mathcal{D}是一个映射 ,它将每个问题分为一组子问题。P→P(P)P→P(P)P \rightarrow \mathfrak{P}(P) CC\mathcal{C}是一个映射,它将子问题的解决方案(取决于“枢轴问题”的类型)连接起来以产生一个解决方案。P×P(S)→SP×P(S)→SP\times \mathfrak{P}(S) \rightarrow S 然后,对于给定的骨架和问题,以下泛型函数计算一个解(在形式上义)为:s=(Pβ,β,D,C)s=(Pβ,β,D,C)s=(P_\beta, \beta, \mathcal{D}, \mathcal{C})pppfs:P→Sfs:P→Sf_s: P\rightarrow Sppp fs(p)={β(p)C(p,f(D(p)))if p is basicotherwisefs(p)={β(p)if p is basicC(p,f(D(p)))otherwisef_s(p)= \left\{ \begin{array}{l l} \beta(p) & \quad \text{if $p$ is basic}\\ \mathcal{C}(p,f(\mathcal{D}(p))) & \quad \text{otherwise} …

2
类别理论的含义还不知道如何处理高阶函数?
在阅读乌代雷迪的 答案到什么是SML仿函数和类理论之间的关系?乌代州 范畴论尚不知道如何处理高阶函数。有一天,它将。 由于我认为范畴论可以作为数学基础,因此应该有可能推导所有数学和高阶函数。 那么,范畴论的含义是什么,尚不知道如何处理高阶函数?将类别理论视为数学基础是否有效?

4
0-1矩阵向量乘法的自动优化
题: 当矩阵密集且仅填充零和一时,是否存在用于生成有效地应用矩阵矢量乘法的代码的确定过程或理论?理想情况下,优化的代码将系统地利用先前计算的信息来减少重复的工作。 换句话说,我有一个矩阵MMM ,我想基于进行一些预计算MMM,这将在以后接收到向量v时使计算MvMvMv效率尽可能高。vvv MMM是在“编译时”已知的矩形密集二进制矩阵,而vvv是仅在“运行时”已知的未知实向量。 示例1 :(滑动窗口) 让我用一个简单的小例子来说明我的观点。考虑矩阵 M=⎡⎣⎢⎢⎢11111111111111111111⎤⎦⎥⎥⎥.M=[11111111111111111111].M = \begin{bmatrix}1 & 1 & 1 & 1 & 1\\ & 1 & 1 & 1 & 1 & 1 \\ & & 1 & 1 & 1 & 1 & 1\\ & & & 1 & 1 & 1 & …

2
计算表达式与monad相同吗?
此问题是从Stack Overflow 迁移而来的,因为可以在Computer Science Stack Exchange上回答。 迁移 5年前。 我仍在学习函数式编程(使用f#),最近我开始阅读有关计算表达式的文章。我仍然不完全理解这个概念,而让我不确定阅读所有有关monad的文章(其中大部分是基于Haskell撰写的)时,我不确定的是计算表达式和monad之间的关系。 写下所有内容后,这是我的问题(实际上是两个问题): 每个F#计算表达式都是monad吗?每个单子都能用F#计算表达式表示吗? 我已经读过Tomas Petricek的这篇文章,如果我对它的理解很好,它指出计算表达式比monad还要多,但是我不确定我是否正确解释了这一点。

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.