计算机科学

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

2
此重排/排序问题的名称?
给您一个长度为的数组。数组的每个元素都属于K类之一。你应该重新排列使用交换操作的最小数量,以使阵列的所有元素从相同类总是组合在一起,即它们形成连续的子阵列。 例如: nnnKKK 剩下三个有效的安排。[2,1,3,3,2,2]⟶[2,2,2,1,3,3], or[2,1,3,3,2,2]⟶[1,2,2,2,3,3], or[2,1,3,3,2,2]⟶[3,3,2,2,2,1].[2,1,3,3,2,2]⟶[2,2,2,1,3,3], or[2,1,3,3,2,2]⟶[1,2,2,2,3,3], or[2,1,3,3,2,2]⟶[3,3,2,2,2,1]. \begin{align*} &[2, 1, 3, 3, 2, 2] \longrightarrow [2, 2, 2, 1, 3, 3], \text{ or} \\ &[2, 1, 3, 3, 2, 2] \longrightarrow [1, 2, 2, 2, 3, 3], \text{ or} \\ &[2, 1, 3, 3, 2, 2] \longrightarrow [3, 3, …

3
“地图”是什么意思?
我在各种CS教育材料中已经多次遇到过这个术语: L2 CS162(加州大学伯克利分校): 内存映射的I / O L4 CS162(加州大学伯克利分校): 内存映射文件 L24 CS61(加州大学伯克利分校): “内存映射的I / O”:映射到CPU地址空间的设备控制/数据寄存器 甚至在谷歌搜索“映射”之后,我得到了文章 Map_(higher-order_function),但是对我来说还不是很清楚。 更甚者,尝试bitmap通过阅读Wikipedia文章来理解上下文中的含义: 位数组是从某个域(几乎总是整数范围)到集合{0,1}中的值的映射 我不确定,但是在上面的上下文中,这对我来说是关于数据转换的。 后来,在阅读了CS书籍之后,我只找到了这一段,但没有为我解释“映射”的含义: 内存映射Linux(以及其他形式的Unix)通过将虚拟内存区域与磁盘上的对象相关联来初始化虚拟内存区域的内容,此过程称为内存映射。 我还得到了MapReduce作为搜索结果:where map被解释为“并行计算中的一种习语,其中对序列的所有元素(可能是并行的)应用简单的操作”。 我对这个词仍然感到困惑。在我提到的环境中,谁能解释“地图”的含义?

2
为什么播放音频不会停止其他任务?
如果处理器一次只能执行一件事情,那么我怎么能连续播放音乐却仍然能够执行其他任务? 我了解中断系统,但不是不要求CPU持续处理音频以使其听起来不那么抖动/迟钝吗? 我问的是底层实现,这个问题与多线程有关吗?1核1线程CPU如何实现这种多任务处理?

1
逻辑上“完成”有双重概念吗?
如果两个计算模型可以相互编码,则可以证明两个计算模型是完整的。如果每个推理规则的编码(如果存在则可能是公理)被证明是另一个定理,则可以证明两个逻辑是完整的。在可计算性方面,这导致了图灵完整性和教会图灵论文的自然思想。但是,我还没有看到逻辑上的完备性导致自然而然地得出类似质量的总体完备性的想法。 由于可证明性和可计算性是如此紧密地联系在一起,因此我认为没有什么逻辑上的概念可以成为图灵完备性的自然对偶。从推测上来说,是这样的:存在一个“真”定理,当且仅当存在一个计算模型无法描述的可计算函数时,该定理才能在逻辑中证明。我的问题是,有人研究过吗?参考或一些关键字会有所帮助。 在上一段中,“真实”和“可计算”是指直觉但最终无法定义的想法。例如,有人可以证明,在没有完全定义“真”的概念的情况下,古德斯坦序列的有限性是“真”的,但在Peano算术中无法证明。类似地,通过对角化可以显示出,在没有完全定义可计算的概念的情况下,存在一些不是原始递归的可计算函数。我想知道,即使它们最终最终都是经验性的概念,也许这些概念之间的关联性可能足够好,可以将完整性的概念联系起来。

1
难道这是一个NP完全问题?
考虑以下问题陈述: 给定一个初始数字,您和您的朋友轮流从中减去一个完美的平方。第一个获得零胜利的人。例如: 初始状态:37 玩家1减去16。状态:21 玩家2减去8。状态:13 玩家1减去4。状态:9 玩家2减去9。状态:0 Player2获胜! 编写一个程序,该程序给出一个初始状态,并返回最佳动作,即可以确保赢得比赛的动作。如果没有任何可能的举动会导致您进入获胜状态,请返回-1。 使用动态规划可以在伪多项式时间内解决此问题。这个想法只是用最佳移动从下往上填充长度为n(其中n是初始状态)的数组,如果没有移动导致获胜,则为-1。这将花费O(n * sqrt(n)),因为对于每个数字,我们都需要考虑减去每个可能的小于它的理想平方(其中有〜sqrt(n)个)。但是,这是伪多项式运行时复杂性,因为运行时实际上相对于二进制(用于表示数字的位数)的大小与输入大小成比例关系。 谁能想到解决这个问题的多项式算法?如果没有,那么它可以是NP-Complete吗?为什么?

1
为什么在依赖类型系统中将递归类型用作证明的原语?
我是类型理论和依赖编程的新手。我一直在研究构造(CoC)和其他纯类型系统的演算。我对将其用作编译器系统的保存证明中间表示特别感兴趣。 据我所知,(共)递归类型表示的,在计算上,使用作为唯一的类型构造函数。不过,我已经读过,它们不能用于归纳构建证明(请原谅,我现在找不到位置!),例如,我无法在普通CoC中证明(即使可以键入)。ΠΠ\Pi0≠10≠10\neq 1NatNat\texttt{Nat}Π(N:∗).Π(S:N→N).Π(Z:N).NΠ(N:∗).Π(S:N→N).Π(Z:N).N\Pi(\mathbb{N}:*).\Pi(S:\mathbb{N}\rightarrow\mathbb{N}).\Pi(Z:\mathbb{N}).\mathbb{N} 我认为这就是为什么他们建立了归纳结构(CIC)的原因。它是否正确?但为什么?我找不到任何材料来解释为什么不使用(共)归纳类型作为原语就无法表示这样的证明。如果不是这样,那么为什么要在CIC中将它们添加为原语?

3
将无向图视为有向图的子类别
大致来说,无向图与有向图非常相似,其中对于每个边(v,w),总会有一个边(w,v)。这表明将无向图视为有向图的子集是可以接受的(也许有一个附加限制,即添加/删除边只能在匹配对中完成)。 但是,教科书通常不遵循这种处理方式,而是更倾向于将无向图定义为一个单独的概念,而不是有向图的子类别。有什么理由吗?

2
社交网络图问题
这是问题所在: 有连接的图,其中的节点代表许多人。每个节点/人都对某个话题有自己的见解,例如王牌与克林顿,纸质书与点燃等 目的是通过按特定顺序选择节点的特定子集,使图形中的每个节点共享相同的观点。 如果大多数人A的朋友支持王牌,但是人A支持克林顿。如果选择了人员A,他/她的意见将变为王牌。 如果某人的朋友意见均分,则可以决定所选人的意见。 关于如何证明这是可以实现的,我的想法不多了。也许有些人可以给我一些指导。

1
有关通过检查邻接矩阵多项式来图同构的朴素方法的文献
我描述了一种可能有假阳性的图同构方法,并且我很好奇是否有文献表明它不起作用。 给定两个邻接矩阵,检查同构的一个公认的幼稚方法是检查是否对每行的,有一个行的其是行的置换,记为。稍微更严格的是问题,是否有一个“本地同构”为其中对于所有的行。可以通过建立一个具有的矩阵来在多项式时间内完成局部同构。然后是和G,HG,HG, HuuuGGGvvvGGGuuuG[u]∼H[v]G[u]∼H[v]G[u] \sim H[v]ππ\piG[u]∼H[π(u)]G[u]∼H[π(u)]G[u] \sim H[\pi(u)]n×nn×nn\times nAAAA[u,v]=(G[u]∼H[v])A[u,v]=(G[u]∼H[v])A[u,v] = (G[u]\sim H[v])GGGHHH如果具有循环覆盖,并且每个循环覆盖都是局部同构,则它们是局部同构的。AAA 显然,所有正则图都愚弄了此方法,因此,天真的方法要稍微少一点点,就是计算幂并检查它们的局部同构性,可以通过在发现任何使幂时设置来设置多个矩阵,并仅在最后检查循环覆盖。甚至更少幼稚的方法是找到一组多项式,确实一组算术电路,并且设置A [U,V] = 0时,我们发现任何多项式p与P(G)[U] \不\ SIM P( H)[v]。G2,H2,G3,H3,…G2,H2,G3,H3,…G^2, H^2, G^3, H^3,\ldotsA[u,v]=0A[u,v]=0A[u,v] = 0Gk[u]≁Hk[v]Gk[u]≁Hk[v]G^k[u]\not\sim H^k[v]A[u,v]=0A[u,v]=0A[u,v]=0pppp(G)[u]≁p(H)[v]p(G)[u]≁p(H)[v]p(G)[u]\not\sim p(H)[v] 在我看来,这似乎是一种非常幼稚的图同构方法,因此我确信有人已经对其进行了研究并证明了一个定理,例如 Thm对于无限多个nnn存在非同构n \ x n个n×nn×nn\times n矩阵G,HG,HG, H和一个置换ππ\pi,使得对于每个多项式ppp,p(G)p(G)p(G)和p(H)p(H)p(H)通过置换进行局部同构:p(G)∼πp(H)p(G)∼πp(H)p(G)\overset{\pi}{\sim}p(H)。 问题:有这样一个定理吗?我看过文献,找不到。 如果有一个键合上的程度即在多项式使得对于每两个非同构矩阵,本地同构是通过计算反驳,或者如果存在一个易于计算的多项式族,每个都有多项式边界长度,但可能是指数级,那么我们就有一个P算法用于图同构。如果这样的多项式(或算术电路)很容易猜到,那么我们有一个coRP算法。如果总是存在一个(家族)算术电路来见证非局部同构,那么就给出了一个coNP算法。kkknnnG1,H1,…,Gpoly(n),Hpoly(n)G1,H1,…,Gpoly(n),Hpoly(n)G^1, H^1, \ldots, G^{poly(n)}, H^{poly(n)}p1,…,pkp1,…,pkp_1, \ldots ,p_k 注意,我们可以通过在小场上计算多项式,例如通过对小素数进行模运算来避免高功率矩阵的项变得太大的问题。在coNP算法中,证明者可以提供这些素数。

1
属于头等公民
来自C ++背景,我不明白为什么一个人需要作为一等公民的类型/类型表达式?我知道支持该功能的唯一语言是Aldor。 是否有人拥有有关头等公民的类型的文献或知道其有用性的一些原因?

2
是否研究了有限状态自动机的以下扩展?
像往常一样考虑有限状态机,但是每次转换时,它也可以通过加或减数字来更新整数计数器。比方说,具有以下形式的转换函数 移动到新的状态p,并添加ķ到计数器,其中ķ ∈ Ž(所以ķ可以是正,负或零) 。δ(q,a )= (p ,k )δ(q,a)=(p,k)\delta(q,a) = (p,k)pppķkkķ ∈ žk∈Zk \in \mathbb{Z}ķkk 如果最终状态和计数器值在,则可接受字符串,其中F是状态和计数器值对的有限集合。FFFFFF 这个模型已知吗?我找不到此特定扩展名的任何参考。

1
函数式编程语言实现的算法复杂度分析
我今天了解到,算法分析基于计算模型而有所不同。这是我从未想过或从未听说过的事情。 @chi用户给我的示例进一步说明了这一点: 例如,考虑任务:给定 返回 。在RAM中,这可以在解决, 因为数组访问是固定时间的。使用TM,我们需要扫描整个输入,所以它是(i,x1,…,xn)(i,x1,…,xn)(i,x_1 ,…,x_n )xixix_iO(1)O(1)O(1)O(n)O(n)O(n) 这使我对功能语言感到疑惑。从我的理解,“函数式语言是密切相关的演算”(由尤瓦Filmus一个评论对这里)。因此,如果功能语言基于lambda演算,但它们在基于RAM的计算机上运行,​​那么对使用纯功能数据结构和语言实现的算法进行复杂度分析的正确方法是什么? 我没有机会阅读“ 纯粹的功能数据结构”,但是我浏览了Wikipedia页面上的主题,并且似乎某些数据结构确实用以下方法代替了传统的数组: “数组可以用映射或随机访问列表替换,这允许使用纯功能实现,但是访问和更新时间是对数的。” 在那种情况下,计算模型会有所不同,对吗?

4
一群人互相购买礼物的最低购物次数
我们有个人。我们列出了谁必须为组内谁购买礼物的清单。每个人可能需要购买/接收任意数量的礼物,或者根本不需要。在购物旅行中,一部分人会一起前往同一家商店,并为不在商店中的任何人购买礼物。他们可能不会在同一购物之旅中为其他人购买礼物,因为那样就不会感到惊讶。一个人可能会进行多次购物旅行。我们希望最大程度地减少每个人购买所需礼物所需的购物行程总数。ñnn 例如,假设有5个人,每个人都必须为组中的其他每个人购买礼物。让人们从1到5进行编号。这可以在4个购物行程中完成,如下所示: 行程1、1、2、3去购物 行程2:1、4、5去购物 旅程3:2、4去购物 行程4:3、5购物 我将如何解决这个问题?很明显,输入可以用有向图表示,但是我不知道从那里去。有人提出了biclique覆盖问题,但尽管类似,却无法回答这个问题。 我们可以将输入视为个顶点上的有向图,其中边表示人u必须为人v购买礼物。的目标是找到一组bicliques的(小号1,Ť 1),... ,(小号ķ,Ť ķ)使得ķ是最小的,并且边集Ë图的的一个子集∪ 我(š 我 × Ť 我)G GGn nn(u ,v )(u,v)(u,v)uuvv(S1,T1),…,(Sk,Tk)(S_1,T_1),\dots,(S_k,T_k)kkEE∪i(Si×Ti)\cup_i (S_i \times T_i)。同样,在将双斜线的定义扩展到有向图时,双斜线(S i,T i)(Si,Ti)(S_i,T_i)仅包含将S i映射SiS_i到T i的边TiT_i。这不同于biclique覆盖问题中,我们不要求每个biclique是的一个子图G ^GG(我们不要求小号我 × Ť 我 ⊆ ËSi×Ti⊆ES_i \times T_i \subseteq E每个我ii)。 具体来说,我会接受以下任一答案: 证明此问题是NP难题或 提出了多项式时间算法,可以准确回答此问题(无近似值或上限) 记录下来,我在任何地方都没有看到这个问题,我只是出于好奇而想知道。

4
证明功能代码正确的常见形式化技术有哪些?
我想为我作为论文一部分编写的Haskell程序的某些部分提供证明。但是到目前为止,我找不到很好的参考书。 格雷厄姆·赫顿(Graham Hutton)的入门书籍《编程在Haskell中编程》(《Google图书》)(我在学习Haskell时就读了)涉及一些推理程序的技巧,例如 方程式推理 使用非重叠模式 列表归纳 在第13章中,但不是很深入。 您是否可以推荐任何书籍或文章,以更详细地概述Haskell或其他功能代码的形式证明技术?

3
试图了解此Quicksort正确性证明
该证明是归纳证明,其内容如下: P(n)是“快速排序对长度为n的每个输入数组正确排序”的断言。 基本情况:每个长度为1的输入数组都已排序(P(1)成立) 归纳步骤:修复n => 2.修复一些长度为n的输入数组。 需要说明:如果对于所有k <n,P(k)成立,那么P(n)也成立 然后,他绘制围绕某个枢轴p划分的数组A。因此,他绘制了p,并将数组<p的部分称为第一部分,将> p的部分称为第二部分。部分1的长度= k1,部分2的长度为k2。通过“分区”子程序的正确性证明(之前已证明),枢轴p缠绕在正确的位置。 通过归纳假设:第1,第2部分通过递归调用正确排序。(使用P(K1),P(k2)) 所以:在递归调用之后,整个数组都将正确排序。 QED 我的困惑:我很难确切地看到这如何证明它的正确性。因此,我们假设P(k)确实适用于所有自然数k <n。 到目前为止,我看到的大多数归纳证明都类似:证明基本情况,并证明P(n)=> P(n + 1)。他们通常还涉及某种代数运算。这个证明似乎有很大的不同,我不理解如何将归纳概念应用到它。我可以合理地推断出Partition子例程的正确性是关键。因此,其正确性的理由如下:我们知道,每个递归调用都会围绕枢轴对数组进行分区。然后,该支点将处于其应有的位置。然后,每个子数组将进一步围绕枢轴进行划分,然后该枢轴将处于其正确位置。这样一直进行下去,直到得到长度为1的子数组,该数组被简单地排序了。 但是然后我们不假设P(k)满足所有k <n...。实际上我们正在展示它(因为Partition子例程将始终将一个元素置于其合法位置。)我们不是假设P (k)持有所有k

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.