计算机科学

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

1
形式语言之间适当的同构是什么?
一个正式的语言 过字母表的一个子集,即,一组在该字母的单词。如果对应的集合作为子集在扩展上相等,则两种形式语言和相等。可以在复杂性理论中使用语言来形式化“问题”的概念。有人可能会抱怨说,“一般”的延伸平等是无法决定的,但我认为这会被误导。Σ Σ *大号大号'大号∪ 大号“大号LLΣΣ\SigmaΣ∗Σ∗\Sigma^*大号LLL′L′L'L∪L′L∪L′L\cup L' 自一段时间以来,我一直在思考以下问题:两种语言和对于字母和(其中,,和大号' Σ = { 一个,b } Σ ' = { Ç ,d } 一个b ç d 甲⊥LLLL′L′L'Σ={a,b}Σ={a,b}\Sigma=\{a,b\}Σ′={c,d}Σ′={c,d}\Sigma'=\{c,d\}aaabbbcccddd是不同的字母),即使它们“完全”描述相同的“问题”,也永远不可能相等。但是,如果它们确实“完全”描述相同的“问题”,则它们应该是同构的。我想知道适合同构理论的同构可能概念。我最初以为像有限状态机这样的计算能力较弱的“转换器”可以用来定义允许的同构,但是对于等效逻辑公式之间的琐碎句法翻译,这似乎已经崩溃了。(例如,请参阅此表,其中包含线性逻辑中对偶 的语法定义A⊥A⊥A^\bot。) 今天,我有以下想法:与某个“决策问题”相对应的语言定义通常包含两个部分:(1)将允许的问题实例编码为有限的符号字符串,以及(2)对“属于该语言的“已接受”问题实例。如果检查给定的有限符号串是否是允许的问题实例的编码,则在计算上要比有限状态机强,那么该强机也应用于定义允许的同构。 问题:这种推理方式是否有可能“解决”我的问题?我的问题是否已经解决,所以我只需要阅读正确的参考资料?我的问题本身是否有意义,还是像抱怨扩展性的不确定性一样被误导了? 编辑(尚未给出答案)我注意到“(1)将允许的问题实例编码为有限的符号字符串”已经包含了标准化输入的(隐藏)假设。如果没有这种假设,则两个不同的有限字符串可能对应于同一问题实例。代替检查给定的有限字符串是否有效,该检查可能会产生规范化的输入(并将无效的字符串映射到特殊的字符串)。 该设置的优点在于,进行检查/归一化的机器已经配备了将有限字符串转换为其他有限字符串的装置。用于此任务的允许的机器(复杂度等级)可以是问题定义的一部分,(同构)同态将使用同一台机器(复杂度等级)。(根据拉斐尔的评论提出的“多时多一减法”的建议,的确是出现问题的一种可能性。)PP\mathsf{P} 缺点是这种规范方式可能仅适用于确定性机器。非确定性机器可能需要更灵活的方式来指定/确定两个输入字符串是否对应于同一问题实例。

1
为什么内省型使用堆排序而不是合并排序?
作为涉及内省排序实现的家庭作业的一部分,我被问到为什么使用堆排序而不是合并排序(或其他算法)。 Ø (ñ 日志(n ))Ø(ñ日志⁡(ñ))O(n\log(n)) Introsort是一种混合排序算法,可提供快速平均性能和(渐近)最佳最坏情况性能。它从快速排序开始,并在递归深度超过基于排序元素数量(的对数)的级别时切换到堆排序。(Wikipedia,检索2014年5月6日。) 我能想到的唯一原因是,heapsort是“就位”的……但是,我并不真正理解为什么这在这里很重要。

1
为什么浮点模量精度很重要?
当前,大多数Smalltalk方言都实现了幼稚的不精确浮动模数(fmod / remainder)。 我刚刚进行了更改,以提高Squeak / Pharo并最终提高了其他Smalltalk对标准(IEEE 754,ISO / IEC 10967)的遵守程度,就像我对其他最新浮点运算所做的那样。 但是,对于采用这些更改,我希望遵守标准不足以说服我的同龄人,因此解释一下在什么情况下这种准确性确实很重要将对我有很大帮助。到目前为止,我自己找不到一个很好的例子。 这里有谁知道为什么/何时/何地(IOW在哪种算法中)如此精确的模数很重要吗?

1
可逆计算的“保存输入”方法有何缺陷?
我是一名刚开始读可逆计算的本科生。我知道,由于Landauer的原理,不可逆的计算会耗散热量(而可逆的计算则不会)。我和我的教授一起提出了这个问题,他以前从未听说过可逆计算,而且他很难理解为什么可逆计算理论并不简单。 他的观点是,您始终可以保存输入,即对于任何函数您想使其可逆的,请定义一个新函数(或,您只需在输入的最后位输入 s ),这将在前位返回输出,在其他位返回输入。然后,为了反转您只需丢弃输出并返回您保存的输入。f:{0,1}n→{0,1}nf:{0,1}n→{0,1}nf: \{ 0, 1 \}^n \rightarrow \{ 0, 1 \}^nfreversible:{0,1}n→{0,1}2nfreversible:{0,1}n→{0,1}2nf_{reversible}: \{ 0, 1 \}^n \rightarrow \{0, 1 \}^{2n}{0,1}2n→{0,1}2n{0,1}2n→{0,1}2n\{ 0, 1 \}^{2n} \rightarrow \{0, 1 \}^{2n}000nnnnnnnnnfreversiblefreversiblef_{reversible} 我的直接反对意见是,这要比原始函数占用更多的内存-尽管只是一个恒定的因素。但是,将输出限制为位似乎可以恢复问题的趣味性。这通常是可逆计算的意思吗?nnn 另一个异议似乎是当我们丢弃输出时,我们正在做不可逆的操作,这将耗散热量。但是我们正确地恢复了初始状态,那么它将如何不可逆转?我对物理学的了解不足,无法理解重要的东西是否仅仅是对整个计算而言是可逆的,或者每个步骤是否也需要可逆,还是这个想法只是错误的树。

2
时钟页面替换算法-现有页面
在模拟时钟页面替换算法时,当内存中已存在一个引用时,时钟指针是否仍会增加? 这是一个例子: 4个插槽,使用时钟页面替换算法 参考列表:1 2 3 4 1 2 5 1 3 2 4 5 初始列表如下所示: -> [1][1] [2][1] [3][1] [4][1] 下一个要插入的引用将是1,然后是2。指针在1之后,2之后是否仍指向1?换句话说,插入5后,时钟将如下所示: -> [5][1] [2][0] [3][0] [4][0] ?

1
在航拍照片中识别水道-边缘检测图像中的多边形
我正在尝试从航拍照片中识别出水道(例如Google Maps)。地方政府通常使用GIS数据来说明水路(以及道路,建筑物等)的位置,但是其中的水数据通常有些不准确,我们也许可以使用航拍图像对其进行改进。因此,我们已经有了一些并不总是值得信赖的数据。 我知道如何对数据进行一些基本的图像处理(不幸的是,我这里还没有显示示例图像,我试图想象如何做到这一点,尚无可用的代码): 我可以使用图像中的水道收集一些颜色值集,并找出哪些像素最接近这些颜色,可能还适用于其他类型的要素(草,道路,建筑物等)。如果我设置一个“足够接近”像素的阈值,则会得到一组可能是水道的像素(但会产生很多噪点)。 我可以将图像转换为灰度图像,并使用标准的边缘检测算法来找出边缘在哪里。再次,这给了我一组具有相似边界的像素,但是会产生噪点,边缘也会过分思考和/或存在间隙。 我想要的输出是一组概述可能的水路的多边形。 直观地讲,我想使用检测到的边缘来创建多边形,并使用颜色信息来确定其中哪些是水,这可能要利用我们已经拥有的政府数据。 有没有一种已知的方法可以将边缘检测算法的结果转化为一组漂亮的封闭多边形?如果有更好的方法,或者还有其他有关如何解决此问题的技巧?

3
图形中路径的紧凑表示
我在图中有一些简单路径。路径的长度以为界。ddd 我能以哪种最紧凑的方式(从内存角度)表示路径,以使除所选路径之外的其他路径都无法表示? 请注意,我想在一种算法中使用这种表示形式,该算法将一遍又一遍地遍历路径的这一子集,并且我想相当快,因此,例如,我不能使用任何标准压缩算法。 我想到的一个表示是将它们表示为一组树木。我在猜测,将其降低到最佳数量的树是NP难的吗?还有哪些其他表示形式会很好呢?

2
类型推断+重载
我正在寻找一种针对我正在开发的语言的类型推断算法,但找不到适合我需求的语言,因为它们通常是: Haskellà具有多态性,但没有临时重载 àla C ++(自动),其中有特定的重载,但函数是单态的 特别是我的类型系统是(简化)(我使用的是Haskellish语法,但这与语言无关): data Type = Int | Double | Matrix Type | Function Type Type 而且我有一个运算符*,其中有很多重载: Int -> Int -> Int (Function Int Int) -> Int -> Int Int -> (Function Int Int) -> (Function Int Int) (Function Int Int) -> (Function Int Int) -> (Function …

6
程序验证技术可以防止Heartbleed类型的错误发生吗?
关于Heartbleed错误,Bruce Schneier在4月15日的Crypto-Gram中写道:““灾难性”是正确的词。在1到10的范围内,这是11。几年前,我读到某个操作系统的内核已经通过现代程序验证系统进行了严格验证。因此,现在是否可以通过应用程序验证技术来防止出现Heartbleed风格的错误,还是这是不现实的,甚至基本上是不可能的?


3
我什么时候应该移到k个最近的邻居
对于我们执行的许多机器学习项目,我们从k最近邻分类器开始。这是一个理想的起始分类器,因为我们通常有足够的时间来计算所有距离,并且参数的数量受到限制(k,距离度量和权重) 但是,这通常会导致我们坚持使用knn分类器,因为在项目的后期,没有空间可以切换到另一个分类器。尝试新分类器的充分理由是什么。明显的是记忆和时间限制,但是在某些情况下,另一个分类器实际上可以提高准确性吗?

2
遗传算法的参数选择
如何为遗传算法建模给定系统选择合适数量的参数? 例如,假设您要优化汽车的生产,并且对1,000名不同员工中的每名员工在不同任务下的小​​时效率进行了1,000次测量。因此,您有1,000,000个数据点。其中大多数可能与工厂的整体效率之间存在弱关联,但并非如此弱,以至于您可以说它们与统计信心无关。如何为GA选择输入,以使您没有1,000,000+的自由度,从而导致收敛速度非常慢或完全没有收敛? 具体来说,一个可以用来预选或选择性消除特征的算法是什么? 我在这种情况下使用的一种方法是自行发展参数选择,因此我可能会有像{a,b,c},{b,d,e,q,x,y,z}等等的父项。然后,我将对孩子进行突变以添加或删除功能。这对几十个功能都适用。但是问题是,如果存在大量的自由度,效率会很低。在这种情况下,您正在查看10^n组合(在上面的示例中10^1,000,000),这使得对功能进行一些预过滤对于获得任何有用的性能至关重要。

1
查找两个节点之间的k最短路径
给定加权有向图和权重函数,通常可以使用Dijkstra算法获得最短路径。我感兴趣的是如何获取最短路径,最短路径,依此类推。G = V,EG=V,EG=V,Ed(u ,v )d(u,v)d(u,v)2ñ d2nd2^{nd}3[R d3rd3^{rd} 问题: 是否有一种有效的算法来获取加权图中两个节点之间的第i条最短路径? 是否有一种有效的算法来获取加权图中两个节点之间的k最短路径? 可以选择任意一个答案,尽管我想知道对第二个问题的答案是否可以比对第一个问题的答案的调用效率更高。ķkk

2
寻找具有较小内存占用的固定实现
我正在寻找设置数据类型的实现。也就是说,我们必须 维持一个动态子集(的大小从宇宙)U = \ {0,1,2,3,\点中,u - 1 \}大小的ü与Ñ Ù = { 0 ,1 ,2 ,3 ,... ,ù - 1 } üSSSnnnU={0,1,2,3,…,u–1}U={0,1,2,3,…,u–1}U = \{0, 1, 2, 3, \dots , u – 1\}uuu 操作insert(x)(将元素添加x到SSS)和find(x)(检查元素是否x为S的成员SSS)。 我不在乎其他操作。对于定向,在我正在使用的应用程序中,我们有u≈1010u≈1010u \approx 10^{10}。 我知道在O(1)时间内同时提供这两种操作的实现O(1)O(1)O(1),所以我主要担心数据结构的大小。我希望有数十亿个条目,但希望避免交换。 如果有必要,我愿意牺牲运行时间。我可以接受O(\ log n)的摊销运行时间O(logn)O(log⁡n)O(\log n);不允许使用预期的运行时或ω(logn)ω(log⁡n)\omega(\log n)中的运行时。 我的一个想法是,如果SSS可以表示为范围的并集[xmin, xmax],那么我们将能够以一些性能下降的代价节省存储空间。同样,其他一些数据模式也是可能的,例如[0, 2, 4, 6]。 您能否指出我可以执行类似操作的数据结构?

4
什么是动态编程的“动态”?
我的一位前辈接受了工作面试,有人问他为什么称之为动态。他无法回答,他放弃了采访者后说,它没有任何动态,只是这样称呼它。我很难相信这一点。 它是否指的是子问题在运行时已解决并用于最终目标的事实?像在运行时发生的动态内存分配一样? [回答] 在问这个问题之前,我应该读过这个 Wiki文章,对不起。

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.