计算机科学

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

1
为什么展开树旋转算法会同时考虑父节点和祖父母节点?
我不太了解为什么splay树数据结构中的轮换不仅要考虑评级节点的父级,还要考虑祖父母(zig-zag和zig-zig操作)。为什么以下方法不起作用: 例如,当我们插入树的新节点时,我们检查是否插入到左或右子树中。如果插入到左侧,则将结果向右旋转,反之亦然,将右子树旋转。递归就是这样 Tree insert(Tree root, Key k){ if(k < root.key){ root.setLeft(insert(root.getLeft(), key); return rotateRight(root); } //vice versa for right subtree } 那应该避免整个“花花公子”程序,你不觉得吗?

7
“平均”分配项目的算法
我正在寻找一种算法来分配列表中的值,以使结果列表尽可能“平衡”或“均匀分布”(用引号引起来,因为我不确定这些是描述它的最佳方法...稍后,我将提供一种方法来衡量结果是否优于其他结果。 因此,对于列表: [1, 1, 2, 2, 3, 3] 重新分配值之后,最好的结果之一是: [1, 2, 3, 1, 2, 3] 可能还会有其他结果,但当然,使用一组不太统一的值会变得更加复杂。 这是衡量结果是否优于其他方法的方法: 计算每个项目和具有相同值的下一个项目之间的距离。 计算该组距离的标准偏差。较低的分散度意味着更好的结果。 观察结果: 当计算距离并到达列表的末尾而没有找到具有相同值的项目时,我们返回到列表的开始。因此,最多将找到相同的项目,并且该项目的距离将是列表的长度。这意味着列表是循环的; 一个典型的列表有〜50个项目,其中〜15个不同值的数量不同。 所以: 结果[1, 2, 3, 1, 2, 3]是距离为[3, 3, 3, 3, 3, 3],标准差为0; 结果[1, 1, 2, 2, 3, 3]是距离为[1, 5, 1, 5, 1, 5],标准差为2; 这使第一个结果优于第二个结果(偏差越小越好)。 给定这些定义,我想知道应该搜索哪些算法或策略的线索。

4
如何证明语法是明确的?
我的问题是如何证明语法是明确的?我有以下语法: 小号→ 小号吨一吨ë 米Ë Ñ 吨| 如果 Ë X p - [R ë 小号小号我ø Ñ 然后 小号∣if expression then S else SS→statement∣if expression then S∣if expression then S else SS → statement ∣ \mbox{if } expression \mbox{ then } S ∣ \mbox{if } expression \mbox{ then } S \mbox{ else …

6
编程语言,正则表达式和形式语言之间的关系是什么
我在网上四处寻找这个问题的答案,似乎每个人都隐含地知道答案,除了我。据推测,这是因为唯一关心的人是受过该学科高等教育的人。另一方面,我却被高中作业深深吸引。 我的问题是,编程语言与形式语言到底有什么关系?在我读过的任何地方,都说着类似“形式语言用于定义编程语言语法”的内容。 现在,根据我的能力,正式语言是一系列适用于一组特定符号(该语言的字母)的生产规则。这些生产规则定义了一组转换,例如: b -> a aaa->c 可以这样应用: abab->aaaa aaaa-> ca 顺便提一句,如果我们将形式语言的字母定义为{a,b,c},则a和b是非终结符,而c是终结符,因为它不能转换(如果我错了,请纠正我那)。 那么,考虑到所有这些,这到底在编程语言中有什么用呢?通常还会指出,正则表达式用于解析其文本形式的语言,以确保语法正确。这很有道理。然后说明正则表达式是由正式语言定义的。正则表达式返回true或false(至少以我的经验),这取决于代表正则表达式的有限状态自动机是否达到目标点。据我所知,这与转换无关。 对于程序本身的编译,我认为一种形式语言可以将代码转换为连续的较低级别的代码,并最终通过一组复杂的规则到达汇编,然后硬件可以理解这些规则。 从我的困惑来看,这就是事实。我所说的内容可能有很多根本上的错误,这就是为什么我要寻求帮助。 *除非您认为某条(a|b)*b*c->true规则类似于生产规则,否则在这种情况下该规则需要一个有限状态自动机(即regex)。就像我们刚才说的那样,这没有任何意义

2
高效的地图数据结构,支持近似查找
我正在寻找一种数据结构,该结构支持有效的键近似查找(例如,字符串的Levenshtein距离),并为输入键返回最接近的匹配项。到目前为止,我找到的最合适的数据结构是Burkhard-Keller树,但是我想知道是否还有其他/更好的数据结构用于此目的。 编辑:我的具体情况的更多详细信息: 字符串之间的Levenshtein差异通常很大。 字符串的最大长度约为20到30个字符,平均长度接近10到12个字符。 我对有效查找比对插入更感兴趣,因为我将构建一组要有效查询的大部分静态数据。

1
“密集”正则表达式生成
这是一个正则表达式的猜想: 对于正则表达式,令长度是其中的符号数,忽略括号和运算符。例如RRR|R||R||R||0∪1|=|(0∪1)∗|=2|0∪1|=|(0∪1)∗|=2|0 \cup 1| = |(0 \cup 1)^*| = 2 猜想:如果并且包含长度为每个字符串 或更小,则。|R|>1|R|>1|R| > 1L(R)L(R)L(R)|R||R||R|L(R)=Σ∗L(R)=Σ∗L(R) = \Sigma^* 也就是说,如果在的长度范围内“密集” ,则实际上会生成所有东西。L(R)L(R)L(R)RRRRRR 一些可能相关的事情: 仅需要一小部分即可生成所有字符串。例如,对于二进制,将对任何。RRRR=(0∪1)∗∪SR=(0∪1)∗∪SR = (0 \cup 1)^* \cup SSSS 在某个时刻,中必须有一颗Kleene星。如果没有,它将丢失一些小于字符串。。RRR|R||R||R| 很高兴看到一个证明或反例。在某些情况下,我错过了很明显的错误吗?有人看过(或类似的)东西吗?

11
冯·诺依曼在罪孽中的随机性不再适用吗?
一些小伙子说: 任何试图通过确定性方法生成随机数的人当然都处于犯罪状态。 这总是意味着您不能仅凭计算机生成真正的随机数。他说,当计算机的大小与单个Intel 8080微处理器(约6000个阀)的大小相同时。计算机变得越来越复杂,我相信冯·冯·诺依曼的说法可能不再正确。考虑到仅软件实现的算法是不可能的。它们在物理硬件上运行。真正的随机数生成器及其熵源也由硬件组成。 这个Java片段陷入了循环: file.writeByte((byte) (System.nanoTime() & 0xff)); 可以创建一个我以图像表示的数据文件: 您可以看到结构,但也有很多随机性。有趣的是,此PNG文件的大小为232KB,但包含250,000灰度像素。PNG压缩级别最高。那只是7%的压缩率。相当不可压缩。有趣的是该文件是唯一的。此文件的每一代都是略有不同的模式,并且具有相似的〜7%压缩率。 我强调这一点,因为这对我的论点至关重要。熵约为7位/字节。当然,使用更强大的压缩算法将减少这种情况。但不要减少到0位/字节附近。通过拍摄上面的图像并将其颜色映射表替换为随机的图像,可以产生更好的印象: 大多数结构(在上半部分)消失了,因为它只是具有相似但略有不同值的序列。这是仅通过在多任务操作系统上执行Java程序而创建的真正的熵源吗?不是统一分布的随机数生成器,而是一个的熵源?由在物理硬件上运行的软件构建的熵源,恰好是PC。 补充性 为了确认每个图像都产生新的熵,而没有所有人共有的固定模式,生成了10个连续图像。然后将它们连接起来,并使用我可以编译的最强大的存档器(paq8px)进行压缩。此过程将消除所有通用数据,包括自动关联,仅保留更改/熵。 串联文件被压缩到〜66%,这导致〜5.3位/字节或10.5Mbits /图像的熵率。令人惊讶的熵⌣⌣ \smile 补充2 有负面评论认为我的压缩测试方法的熵是有缺陷的,仅给出了一个松散的上限估计。因此,现在我通过NIST的官方加密熵评估测试SP800-90B_EntropyAssessment运行了级联文件。这与非IID熵测量一样好。这是报告(很抱歉,这个问题越来越长,但是问题很复杂):- Running non-IID tests... Entropic statistic estimates: Most Common Value Estimate = 7.88411 Collision Test Estimate = 6.44961 Markov Test Estimate = 5.61735 Compression Test Estimate = 6.65691 t-Tuple Test Estimate …

5
为什么NP中没有这个无法确定的问题?
显然,NP中没有任何无法确定的问题。但是,根据维基百科: NP是所有决策问题的集合,对于这些问题,答案为“是”的实例具有[..证明]可通过确定性图灵机在多项式时间内验证。 [...] 当且仅当存在在多项式时间内执行的问题的验证者时,才认为问题出在NP中。 现在考虑以下问题: 给定Diophantine方程,它有没有整数解? 给定一个解决方案,很容易在多项式时间内验证它确实是一个解决方案:只需将数字插入方程式即可。因此,问题出在NP。然而,众所周知,解决这个问题还不确定! (类似地,似乎暂停问题应该在NP中,因为“该程序在第N步停止”的“是”解决方案可以在N步中得到验证。) 显然我的理解有问题,但这是什么?

9
使用硬币生成均匀分布的随机数
你有一枚硬币。您可以根据需要翻转它多次。 要生成的随机数[R[Rr,使得a≤r&lt;ba≤r&lt;ba \leq r < b,其中。r,a,b∈Z+r,a,b∈Z+r,a,b\in \mathbb{Z}^+ 数字的分配应统一。 如果很容易b − a = 2ñb−a=2ñb -a = 2^n: r = a + binary2dec(flip n times write 0 for heads and 1 for tails) 如果b − a ≠ 2ñb−a≠2ñb-a \neq 2^n怎么办?



2
是否存在易于计算但难以验证的问题?
假设P NP,则NP完全问题“很难解决,但答案易于检查”。考虑相反的情况是否有意义,也就是说,对于这些问题而言,很容易计算出正确的答案,而很难验证任意一个所谓的解决方案?≠≠\neq 我认为这样的问题暗示: 对于任何给定的输入,指数地有许多“正确”答案,因为否则可以通过简单地计算所有正确答案来执行验证。 一些“正确”的答案很容易计算,而另一些则很难找到。

3
哪些算法不能并行化?
是否有任何算法很难并行化或研究仍在进行中? 我想了解并行计算中的任何算法或任何研究领域。 我搜索的所有内容都完成了“并行”实现。只是想对任何未开发的并行计算领域进行研究。



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.