Questions tagged «algorithms»

算法是定义明确的问题解决方案的一系列明确定义的步骤。如果您的问题与算法的设计和分析有关,请使用此标签。

1
填充糕点的路由表如何工作?
此问题是从软件工程堆栈交换迁移的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 我正在尝试实现Pastry Distributed Hash Table,但是有些事情使我无法理解。我希望有人能澄清一下。 免责声明:我不是计算机科学专业的学生。我一生中刚上过两门计算机科学课程,但都没有涉及任何远程复杂的问题。我从事软件工作已经有多年了,所以如果我能将想法付诸实践,我觉得我已经完成了实现任务。因此,我可能只是缺少一些明显的东西。 我已经阅读了作者发表的论文[1],并且取得了一些不错的进步,但是我一直对路由表的工作原理这一点感到困惑: 该文件声称 一个节点的路由表中,RRR,被组织成⌈log2bN⌉⌈log2b⁡N⌉\lceil \log_{2^b} N\rceil 与行2b−12b−12^b - 1每个条目。路由表第n行的2b−12b−12^b - 1条目均引用一个节点,该节点的nodeId在前n位共享当前节点的nodeId,但其n + 1位具有2 b − 1可能值之一,而不是所述ñ + 1个数位在本节点的id。nnnn+1n+1n + 12b−12b−12^b - 1n+1n+1n + 1 的bbb代表一个应用程序特定的变量,通常是444。为了简单起见,让我们使用b=4b=4b=4。所以上面是 一个节点的路由表中,RRR,被组织成 ⌈log16N⌉⌈log16⁡N⌉\lceil \log_{16} N\rceil与行151515的每个条目。路由表第n行的151515个条目均引用一个节点,该节点的nodeId在前n个数字中共享当前节点的nodeId,但其n + 1个数字具有除n +以外的2 b - 1可能值之一当前节点ID中的第1位数字。nnnn+1n+1n + 12b−12b−12^b - 1n+1n+1n + 1 我很了解 此外,NNN是群集中服务器的数量。我也知道 …

5
如何应对立式棍棒挑战
此问题是从理论计算机科学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 这个问题来自于viewstreet.com 我们给出一个整数数组表示线段,使得段的端点是和(I,Y_I) 。想象一下,从每个线段的顶部向左发射水平射线,当该射线接触另一个线段或撞击y轴时,该射线停止。我们构造了一个由n个整数组成的数组v_1,...,v_n,其中v_i等于从段i顶部射出的射线的长度。我们定义V(y_1,...,y_n)= v_1 + ... + v_n。Y={y1,...,yn}Y={y1,...,yn}Y=\{y_1,...,y_n\}(我,0 )(我,ÿ 我)v 1,。。。,v Ñ v 我我V (Ý 1,。。。,ÿ Ñ)= v 1 + 。。。+ v nnnniii(i,0)(i,0)(i, 0)(i,yi)(i,yi)(i, y_i)v1,...,vnv1,...,vnv_1, ..., v_nviviv_iiiiV(y1,...,yn)=v1+...+vnV(y1,...,yn)=v1+...+vnV(y_1, ..., y_n) = v_1 + ... + v_n 例如,如果我们有Y=[3,2,5,3,3,4,1,2]Y=[3,2,5,3,3,4,1,2]Y=[3,2,5,3,3,4,1,2],则[v1,...,v8]=[1,1,3,1,1,3,1,2][v1,...,v8]=[1,1,3,1,1,3,1,2][v_1, ..., v_8] = [1,1,3,1,1,3,1,2],如下图所示: 对于每个排列的,我们可以计算。如果我们选择一个均匀随机排列的什么是预期值?[ 1 ,。。。,Ñ ] V (Ý p …

1
有解决此顶点循环覆盖问题的有效算法吗?
此问题是从数学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换中回答。 迁移 3年前。 我一直在尝试找到一种算法,以找到有向图G的最大顶点循环覆盖率-即,一组不相交的循环,其中包含G中的所有顶点,并具有尽可能多的循环(我们不考虑这里的各个顶点循环)。我知道找到最小顶点循环覆盖以及找到具有精确k个循环的顶点循环覆盖的问题是NP完全的。但是最大案例呢?GGGGGGkkk 虽然我通常会找到一个有趣的答案,但是我想用于此的图实际上受其构造的限制,因此即使问题是NP完全的,对于这些特定实例也可能会有多项式解。 我们有一个整数,元素l i的列表,我们将使用S,元素s i对L进行排序后再对其进行引用。举个例子:LLLlilil_iSSSsisis_iLLL L=(1,3,2,5,0,7,4,2,6,0,8,1)S=(0,0,1,1,2,2,3,4,5,6,7,8)L=(1,3,2,5,0,7,4,2,6,0,8,1)S=(0,0,1,1,2,2,3,4,5,6,7,8) L = (1, 3, 2, 5, 0, 7, 4, 2, 6, 0, 8, 1)\\ S = (0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8) 该图的顶点将与对被识别,使得升我 = Ñ和š 我 ≠ Ñ。当且仅当s j = n时,该图具有有向边(n ,i )→ (m ,j …

3
为什么基数排序为
在基数排序中,我们首先按最低有效位排序,然后再按第二最低有效位排序,依此类推,最后得到排序列表。 现在,如果我们有数字的列表,则需要位来区分这些数字。因此,我们进行的基数排序次数将为。每遍花费时间,因此基数排序的运行时间为nnnlognlog⁡n\log nlognlog⁡n\log nO(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n \log n) 但是众所周知,它是线性时间算法。为什么?

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

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

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
将(数学)问题转换为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} …

4
接受随机比较器的排序算法
通用排序算法通常将一组数据进行排序,并使用一个比较器函数来比较两个单独的元素。如果比较器是顺序关系¹,则算法的输出是排序的列表/数组。 我想知道哪种排序算法实际上可以与不是顺序关系的比较器一起使用(特别是在每次比较时都返回随机结果的比较器)。所谓“工作”,是指他们继续返回其输入的排列并以其通常引用的时间复杂度运行(而不是总是降级为最坏的情况,或者陷入无限循环,或者缺少元素)。结果的顺序将是不确定的。更好的是,当比较器是投币游戏时,所得排序将是均匀分布。 从我粗略的脑力计算来看,似乎可以使用合并排序并保持相同的运行时成本并产生合理的随机排序。我认为,诸如快速排序之类的东西会退化,可能无法完成,也不公平。 如随机比较器所述,还有哪些其他排序算法(合并排序除外)可以工作? 作为参考,比较器是一个顺序关系,如果它是一个适当的函数(确定性)并且满足顺序关系的公理: 它是确定性的:compare(a,b)对于特定的对象a,b总是返回相同的结果。 它是可传递的: compare(a,b) and compare(b,c) implies compare( a,c ) 它是反对称的 compare(a,b) and compare(b,a) implies a == b (假设所有输入元素都是不同的,那么自反性就不是问题。) 随机比较器违反所有这些规则。但是,有些比较器不是顺序关系而是随机的(例如,它们可能只违反一个规则,并且仅针对集合中的特定元素)。

1
在图形上添加边时,最短距离会变化多少?
令G=(V,E)G=(V,E)G=(V,E)是一些完整的,加权的,无向的图。我们通过从E到E '一对一地增加边来构造第二个图。我们总共将Θ (| V |)边加到G '。G′=(V,E′)G′=(V,E′)G'=(V, E')EEEE′E′E'Θ(|V|)Θ(|V|)\Theta(|V|)G′G′G' 每次我们添加一个边缘(u,v)(u,v)(u,v)于E′E′E',我们考虑所有对之间的最短距离在(V,E′)(V,E′)(V, E')和(V,E′∪{(u,v)})(V,E′∪{(u,v)})(V, E' \cup \{ (u,v) \})。我们计算由于加而导致的最短距离变化了多少(u,v)(u,v)(u,v)。让CiCiC_i是变化的,当我们添加的最短距离的数量iii边数,令为总和。nnn C = ∑ i C i有多大?C=∑iCinC=∑iCinC = \frac{\sum_i C_i}{n} 由于,所以C = O (n 2)也是如此。这个界限可以改善吗?请注意,我将C定义为所有相加边的平均值,因此,即使证明了C = Ω (n ),也没有那么有趣的一轮,因为距离变化很大。Ci=O(|V|2)=O(n2)Ci=O(|V|2)=O(n2)C_i = O(|V|^2)=O(n^2)C=O(n2)C=O(n2)C=O(n^2)CCCC=Ω(n)C=Ω(n)C = \Omega(n) 我有一种算法可以贪婪地计算几何t跨度,该算法可以在时间内工作,因此,如果C为o (n 2),则我的算法要比原始贪婪算法快,并且如果C真的很小,其速度可能比最著名的算法快(尽管我对此表示怀疑)。O(Cnlogn)O(Cnlog⁡n)O(C n \log n)CCCo(n2)o(n2)o(n^2)CCC 一些特定于问题的属性可能有助于确定界限:添加的边权重始终大于图中已存在的任何边的权重(不一定严格地更大)。此外,它的权重比u和v之间的最短路径短。(u,v)(u,v)(u,v)uuuvvv 您可以假定顶点对应于2d平面中的点,并且顶点之间的距离是这些点之间的欧几里得距离。也就是说,每个顶点对应于平面中的某个点(x ,y ),并且对于边(u ,v )= ((x 1,y …

6
在O(n)时间中:在不传递比较的集合中找到最大元素
标题说明了问题。 作为输入,我们可以比较一个元素列表(确定最大)。没有元素可以相等。 关键点: 比较不是传递性的(想像石头剪刀布):这可能是正确的:A> B,B> C,C> A (请注意,这不是有效的输入,因为此处没有有效的答案,我仅描述“非及物比较”) 每个输入数组将保证有一个答案 最大表示元素必须大于其他所有元素 拥有逆属性,即A> B表示B <A 例: Input: [A,B,C,D] A > B, B > C, C > A D > A, D > B, D > C Output: D 我无法找出在O(n)时间内完成此操作的方法,我最好的解决方案是O(n ^ 2)。 因为要确定答案,所以必须将每种元素与其他所有元素进行显式比较,以证明它确实是答案(因为比较不是可传递的),因此我对每种方法都感到困惑。 这排除了堆的使用,排序等。

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.