计算机科学

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

2
猜测最小的唯一正整数
让我们考虑以下游戏:有一些玩家和一台电脑。每个玩家输入一个正整数和他的名字(玩家不知道另一个人的数字,只是他自己的数字)。当所有玩家移动时,计算机将输出一个获胜者的名字-提交的唯一号码最低。 您如何看待,此游戏的最佳策略是什么?

2
在BST中搜索时可能的搜索路径数
我有以下问题,但没有答案。如果我的方法正确,我将不胜感激: 问:在二叉搜索树中搜索键值60时,遍历包含键值10、20、40、50、70、80、90的节点,而不必按给定的顺序进行。从包含值60的根节点开始的搜索路径中,这些键值可以出现多少种不同的顺序? (A)35(B)64(C)128(D)5040 从这个问题中,我了解到遍历必须包括所有给定的节点,最终我们必须达到键60。例如,这样的组合之一是: 10、20、40、50、90、80、70、60。 由于我们必须遍历上面给出的所有节点,因此我们必须从10或90开始。如果我们从20开始,我们将不会达到10(因为60> 20并且将遍历20的右子树) 同样,我们不能从80开始,因为我们将无法达到90,因为80> 60,我们将在80的左子树中遍历,因此无法达到90。 取10。剩余的节点为20、40、50、70、80、90。下一个节点可以为20或90。出于前面提到的相同原因,我们不能取其他节点。 如果我们以相似的方式考虑,则在每个级别我们都有两个选择。由于有7个节点,因此前6个有2个选择,最后1个没有选择。所以完全有 2 * 2 * 2 * 2 * 2 * 2 * 12∗2∗2∗2∗2∗2∗12*2*2*2*2*2*1排列= = 6426262^6646464 这是正确的答案吗? 如果没有,更好的方法是什么? 我想概括一下。如果给出节点,则总共可能的搜索路径为2 n − 1ñnn2n − 12n−12^{n-1}

4
为什么在正则表达式中没有排列?(即使普通语言似乎能够做到这一点)
问题 没有简单的方法来获取正则表达式的排列。 排列:将单词 (“ aabc”)转换为另一个顺序,而无需更改数字或字母种类。w = x1个… xñw=X1个…Xñw=x_1…x_n 正则表达式:正则表达式。 进行验证: “不重复的正则表达式排列”假设这样做会更简单,那么答案将创建JavaScript代码而不是正则表达式。 “如何查找给定文本中给定单词的所有排列” –答案也不使用正则表达式。 “正则表达式匹配所有{1,2,3,4}而不重复” –答案使用了正则表达式,但它既不适应也不简单。 这个答案甚至声称:“正则表达式不能满足您的要求。它不能从字符串生成排列”。 我正在寻找的解决方案 它应具有以下形式: »aabc«(或其他任何可以使用左括号和右括号的内容) (aabc)!(类似于(abc)?,但最后还有另一个符号) [aabc]!(类似于[abc] +,但最后还有另一个符号) 这些解决方案的优势 他们是: 简单 适应性强 可重用 为什么这应该存在 正则表达式是描述常规语言语法的一种方式。他们完全有能力成为任何一种常规语言。 假设常规语言功能强大,可以进行排列(下面有证明)–为什么没有简单的方法来表达这一点? 所以我的问题是: (为什么)我的证明错了吗? 如果正确:为什么没有简单的方法来表达排列? 证据 正则表达式是记录正则语言语法的一种方法。他们可以描述任何常规语言的语法。 描述任何常规语言(字母表中字母数量有限)的另一种语法是非确定性自动机(状态数量有限)。 具有有限数量的字母,我可以创建此自动机:(示例。正式形式:请参见下文) 接受“ abbc”排列的语法: (很抱歉上面的数字,也许有人知道如何使这部分看起来更好) s->ah¹ s->bh² s->ch³ h¹->bh¹¹ h¹->ch¹² h²->ah¹¹(没有错字!等价) h²->bh²² h²->ch²³ h³->ah¹² h³->bh²³ …

2
除去语法中的左递归,同时保持运算符的左关联
我对此练习有疑问: 令G为λ微积分的以下歧义语法: E → v | λv.E | EE | (E) 其中E是单个非终结符号,λv.E表示带有E中变量v的抽象,而EE表示应用。 定义LL(1)语法G',以使L(G')= L(G)并通过施加以下常用约定来解决G的歧义: 抽象是正确的关联; 申请保持关联; 应用程序具有比抽象更高的优先级。 显示G'的LL(1)解析表和解析字符串时获得的解析树λv1. λv2. v1v2v1。 我消除了歧义设置的优先级和关联,获得了以下语法: E -> EF | F F -> λv.G | G G -> (E) | v 这不是LL(1),因为生产E -> EF是递归的。但是,从该生产中消除左递归可以获得: E -> FE¹ E¹-> FE¹ | ɛ F -> λv.G | …

2
MIN-2-XOR-SAT和MAX-2-XOR-SAT:它们是NP硬的吗?
和\ text {MAX-2-XOR-SAT}的复杂性是什么?他们在P吗?他们是NP硬手吗?MIN-2-XOR-SATMIN-2-XOR-SAT\text{MIN-2-XOR-SAT}MAX-2-XOR-SATMAX-2-XOR-SAT\text{MAX-2-XOR-SAT} 为了更精确地将其形式化,让 Φ(x)=∧niCi,Φ(x)=∧inCi,\Phi\left(\mathbf x\right)={\huge\wedge}_{i}^{n}C_i, 其中x=(x1,…,xm)x=(x1,…,xm)\mathbf{x} = (x_1,\dots,x_m)并且每个子句CiCiC_i的形式为(xi⊕xj)(xi⊕xj)(x_i \oplus x_j)或(xi⊕¬xj)(xi⊕¬xj)(x_i \oplus \neg x_j)。 该2-异或2-异或\text{2-XOR-SAT}问题是要找到一个分配XX\mathbf{x}是满足ΦΦ\Phi。这个问题在PPP,因为它对应于线性方程组mod 222。 该MAX-2-XOR-SATMAX-2-XOR-SAT\text{MAX-2-XOR-SAT}问题是要找到一个分配XX\mathbf{x},最大限度地提高被满足子句的数目。该MIN-2-XOR-SATMIN-2-XOR-SAT\text{MIN-2-XOR-SAT}问题是要找到一个分配XX\mathbf{x},最大限度地减少被满足子句的数目。这些问题的复杂性是什么? 受到MIN或MAX-True-2-XOR-SAT NP-hard的启发吗?

2
是否可以使用最多多项式空间(但是使用指数时间)解决任何NP完全问题?
我了解了NPC及其与PSPACE的关系,我想知道是否可以使用具有最坏情况多项式空间要求的算法来确定性地解决NPC问题,但可能要花费指数时间(2 ^ P(n),其中P是多项式)。 此外,可以将其概括为EXPTIME吗? 我之所以这样问,是因为我写了一些程序来解决NPC问题的退化情况,并且它们在硬实例中会消耗大量RAM,我想知道是否有更好的方法。有关参考,请参见https://fc-solve.shlomifish.org/faq.html。

3
除了Python和前身之外,还有哪些其他编程语言使用缩进来定义代码块?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为Computer Science Stack Exchange 的主题。 11个月前关闭。 Python非常著名地使用缩进来句法定义代码块。(请参阅《 Python语言参考》中的Compound语句)。在使用Python多年之后,我仍然对这种语法功能很感兴趣。 但是我想知道:除了Python及其“前身”(*)语言ABC之外 ,还有哪些其他编程语言使用缩进来定义代码块?代码块在这里意味着“以某种方式被视为一个组成部分的多个语句”。 我对实用的编程语言特别感兴趣,但是深奥的语言可能也值得一提。 (*):“ Predecessor ”是我选择的单词,默认情况下是了解更好的单词。Python的创建者Guido van Rossum 在这样的采访中描述了Python和ABC关于缩进的关系:“ 分组的缩进选择在Python中不是一个新颖的概念;我是从ABC继承过来的。 ”


1
IO monad在技术上是否不正确?
在haskell Wiki上,有以下有条件使用IO monad的示例(请参见此处)。 when :: Bool -> IO () -> IO () when condition action world = if condition then action world else ((), world) 请注意,在此示例中,对的定义IO a是RealWorld -> (a, RealWorld)为了使所有内容都易于理解。 该代码段有条件地在IO monad中执行一个动作。现在,假设condition是False,则action永远不应执行该操作。使用惰性语义确实是这种情况。然而,需要注意这里是Haskell是从技术上来说不严格。这意味着,例如,允许编译器抢先action world在其他线程上运行,然后在发现不需要时放弃该计算。但是,到那时,副作用已经发生了。 现在,可以以这样一种方式来实现IO monad,即仅在整个程序完成时才传播副作用,并且我们确切知道应该执行哪些副作用。但是,事实并非如此,因为有可能在Haskell中编写无限的程序,而这些程序显然具有中间的副作用。 这是否表示IO monad在技术上是错误的,还是有其他阻止此情况发生的方法?

3
为什么空白符号不被视为图灵机输入字母的一部分?
图灵机的定义总是明确的,因为空白符号不是输入字母的一部分。 我想知道将其作为输入字母的一部分会出问题的原因,因为实际上空白符号似乎已经成为输入的一部分。 为了解释最后一句话中的“似乎”,请考虑以下内容。 在默认设置中,输入右边将出现无数个空白符号。当磁带头移到第一个空白符号上方时,计算可以继续进行,因为它不必处于接受或拒绝状态。 现在假定计算随后将输入字母中的符号写到第一个空白符号的右侧,然后返回到最左侧的位置,同时还返回到开始状态。然后,它将使用其他磁带“重新开始”。实际上,它现在从一个不同的输入开始,在空白的右边有以前没有的输入符号。输入似乎有效地包含空白符号。机器的其他行为现在也可能有所不同:再次遇到空白后,它将在右侧遇到不同的符号。 假设确实存在这种情况,为什么不考虑输入字母的空白符号部分,为什么不允许将其作为“初始”输入的一部分呢? 也许这只是一种定义输入的方式,使输入并不总是无限的?


2
时间的词分解
给定两个字符串小号1个,S2S1,S2S_1, S_2,我们为它们的串联写小号1个小号2S1S2S_1S_2。如果给定字符串小号SS和整数ķ ≥ 1k≥1k\geq 1,我们写(S)ķ= S小号⋯ 小号(S)k=SS⋯S(S)^k = SS\cdots S为串接ķkk的副本小号SS。现在给定一个字符串,我们可以使用此符号“压缩”它,即A A B A A BAABAABAABAAB可以写为((A )2B )2((A)2B)2((A)^2 B)^2。让我们称之为a的重量压缩出现在它的字符数,所以的重量((A )2乙2)((A)2B2)((A)^2 B^2)是两个,并且重量(A B )2一个(AB)2A(AB)^2 A(一压缩的A B A B AABABAABABA)是三个(单独的AAA s分别计算)。 现在考虑用|计算给定字符串SSS的“最轻”压缩的问题。S | = n。经过一番思考,有一种明显的动态编程方法可以根据确切的方法在O (n 3 log n )或O (n 3)中运行。|S|=n|S|=n|S|=nO(n3logn)O(n3log⁡n)O(n^3 \log n)O(n3)O(n3)O(n^3) 但是,有人告诉我这个问题可以在O(n2logn)O(n2log⁡n)O(n^2 \log n)时间内解决,尽管我找不到有关如何执行此操作的任何资料。具体来说,这个问题是在最近的编程竞赛中给出的(问题K 在这里,最后两页)。在分析过程中,提出了O(n3logn)O(n3log⁡n)O(n^3 \log n)算法,最后提到了伪二次边界(此处为4分钟标记)。遗憾的是,主持人只提到了“一个复杂的单词组合引理”,所以现在我来这里寻求解决方案:-)

2
多少对支架足以使Brainfuck Turing完整?
Brainfuck是一种图灵完整的编程语言,仅使用8个符号(如果忽略I / O,则使用6个符号)。 将其推向图灵完整性的两个最著名的要素是[和],本质上是Brainfuck的标签和goto。 通常,Brainfuck中的程序使用多套[],但是我想知道到底要使用多少对这些括号才能使Brainfuck Turing完整? 更简单地说,模拟n状态图灵机所需的最少支架数是多少(给定1、2和3状态图灵机的支架数)? 笔记: 我们假设磁带无限且没有计算限制。 这是一个2符号的图灵机

4
领先的旋转栅门操作员是什么意思?
我知道不同的作者使用不同的表示法来表示编程语言的语义。实际上,盖伊·斯蒂尔(Guy Steele)在一段有趣的视频中解决了这个问题。 我想知道是否有人知道领先的旋转门操作员是否具有公认的含义。例如,我不理解以下分母的开头的运算符:⊢⊢\vdash X :Ť1个⊢ Ť2:T2⊢ λ X :Ť1个。Ť2 :T 1个→ T2x:T1⊢t2:T2⊢λx:T1.t2 : T1→T2\frac{x:T_1 \vdash t_2:T_2}{\vdash \lambda x:T_1 . t_2 ~:~ T_1 \to T_2} 有人可以帮我理解吗?谢谢。

2
感觉指数级但为P的问题
我正在尝试建立一个“异常有用”的算法/问题列表,例如,解决“似乎”本质上非常指数化的问题,但是有一些最终可以解决这些问题的特别聪明的算法。我的意思示例: 线性编程(单纯形算法是指数时间;找到多项式时间解花了很长时间!) 更一般而言,半定规划 原始性测试 2-SAT和HORNSAT 计算行列式(如果这听起来并不困难,请考虑永久变量) 寻找完美的搭配 使用有限简单组的分类可以解决各种硬组理论问题 可以使用复杂的禁止次要特征(可嵌入性在任意表面上;树宽和分支宽度的边界; Delta-Wye可约化图)来解决各种硬图问题 计算有界组中的指数(即以步骤计算,通过重复平方来完成)abmodkabmodka^b \mod klogblog⁡b\log b 计算依赖于LLL算法。(作为特殊情况:Euclidean算法。作为更一般的情况:PSLQ或HJLS算法。) 没有泰勒术语(?)的约束问题。我承认我还没有完全理解这一点,但是听起来它可能包含了上面的2-SAT / HORNSAT情况以及有限域上的任何线性代数。在这里看到更长的帖子 可通过全息缩小计算的问题。 值得一提的是,我还要提到图同构,因为它仍然非常简单(),它等效于许多其他同构问题:nlog2nnlog2⁡nn^{\log^2 n} 有向图/多重图/超级图(一种“较难”的问题) 有限自动机/ CFG 显然,这些方面存在一定的困难,但是所有人都会给至少某些人带来某种“惊奇”的感觉,因为这个问题听起来很困难,但事实证明这很容易解决。LP听起来可能相对简单,但是人们花了相当长的时间来建立一个实际的解决方案。反复平方或求解2-SAT是大学生可能会自己想到的事情,但是如果您只看过NP-Complete问题而没有看过HORNSAT,则听起来像是NP-Completeness的自然人选。解决CFSG或采用多项式方法来检查Delta-Wye可还原性并不是一件容易的事。 我希望这是有道理的; 这里显然有很多主观属性,但是我很想知道其他人发现什么是解决“显然很困难”问题的有效解决方案。

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.