Questions tagged «algorithms»

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

8
是否每个数据类型都可以归结为带有指针的节点?
数组或向量只是一系列值。它们肯定可以通过链表实现。这只是一堆带有指向下一个节点的指针的节点。 堆栈和队列是Intro CS课程中通常教授的两种抽象数据类型。在课堂上的某个地方,学生通常不得不使用链接列表作为基础数据结构来实现堆栈和队列,这意味着我们回到了相同的“节点集合”的想法。 可以使用堆创建优先级队列。堆可以看作是一棵以最小值为根的树。各种树(包括BST,AVL,堆)都可以看作是由边连接的节点的集合。这些节点链接在一起,其中一个节点指向另一个节点。 似乎每个数据概念总是可以归结为仅带有指向其他某个适当节点的指针的节点。那正确吗?如果这么简单,为什么教科书不解释数据仅仅是一堆带有指针的节点呢?我们如何从节点转到二进制代码?

4
预订Cormen以外的算法
我已经完成了Cormen的《算法入门》一书中的大部分内容,并且正在寻找一本涵盖Corman本书以外的内容的算法书。有什么建议吗? 注意:我在stackoverflow上询问了此问题,但对答案并不满意。 注意:在我看来,通过阅读大多数评论,我很理想地希望在本课程说明中找到一本涵盖787课程材料的书。

3
是否有一种算法可以在
此问题是从理论计算机科学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 我想证明或反对一种算法的存在,该算法在给定整数数组下找到三个索引和,使得且(或发现没有这样的三元组)线性时间。AAAi,ji,ji, jkkki&lt;j&lt;ki&lt;j&lt;ki < j < kA[i]&lt;A[j]&lt;A[k]A[i]&lt;A[j]&lt;A[k]A[i] < A[j] < A[k] 这不是一个作业问题。我在一个编程论坛上看到它是“尝试实现这种算法”。我怀疑经过各种实验后这是不可能的。我的直觉告诉我,但这并不算什么。 我想正式证明这一点。你怎么做呢?理想情况下,我希望逐步看到一个证明,然后,如果您愿意,可以对如何证明/证明这样的简单问题进行一些解释。如果有帮助,请举一些例子: [1,5,2,0,3] → (1,2,3) [5,6,1,2,3] → (1,2,3) [1,5,2,3] → (1,2,3) [5,6,1,2,7] → (1,2,7) [5,6,1,2,7,8] → (1,2,7) [1,2,999,3] → (1,2,999) [999,1,2,3] → (1,2,3) [11,12,8,9,5,6,3,4,1,2,3] → (1,2,3) [1,5,2,0,-5,-2,-1] → (-5,-2,-1) 我以为有人可以遍历,并且每次有一个(即我们当前的)时,我们都会创建一个新的三元组并将其推入数组。我们继续步进并比较每个三元组,直到完成其中一个三元组。所以,这就像,!但是我认为这比仅仅更复杂,因为在最坏的情况下,我们的三元组数组中三元组的数量将对应于输入列表的大小。AAAi&lt;ji&lt;ji < jjjj[1,5,2,0,-5,-2,-1] → 1..2.. -5.. -2.. -1[1,5,2,0,-5,-2,3,-1] …


1
域名压缩
此问题是从Stack Overflow 迁移而来的,因为可以在Computer Science Stack Exchange上回答。 迁移 7年前。 我对如何紧凑压缩任意IDN主机名(由RFC5890定义)的域感到好奇,并怀疑这可能会成为一个有趣的挑战。Unicode主机或域名(U标签)由一串Unicode字符组成,通常取决于顶级域名(例如,下的希腊字母.gr),被限制为一种语言,该Unicode字符被编码为以xn--(一个标签)。 人们不仅可以根据以下正式要求来建立数据模型: 每个非Unicode标签都是一个字符串匹配^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?$; 每个A标签都是一个字符串匹配^xn--[a-z\d]([a-z\d\-]{0,57}[a-z\d])?$;和 整个域的总长度(A标记和非IDN标记以“。”分隔符连接)不超过255个字符 而且还来自各种启发式方法,包括: 低阶U标签在某些自然语言中通常在词法,句法和语义上都是有效的短语,包括专有名词和数字(连字符除外,不加标点,去除空白并按Nameprep折叠),偏爱较短的短语;和 高阶标签是从SLD和TLD的字典中​​提取的,并为预测低阶标签中使用哪种自然语言提供了上下文。 我担心,如果不考虑数据的这些特定特征,很难对这样的短字符串进行良好的压缩,此外,现有的库将产生不必要的开销,以适应其更一般的用例。 阅读Matt Mahoney的在线书《Data Compression Explained》,很显然,可以利用许多现有技术来利用上述(和/或其他)建模假设,与不那么具体的工具相比,它们应该带来更好的压缩效果。 就上下文而言,此问题是SO上一个问题的分支。 最初的想法 令我惊讶的是,这个问题是脱机培训的绝佳选择,我设想了以下几行的压缩数据格式: 霍夫曼编码的“ 公共后缀 ”,其概率来自域名注册或流量的某些公开来源; 其余的U标签使用霍夫曼编码(自然语言)模型,并从给定的域后缀上下文中某些已发布的域注册或业务量来源中提取概率; 应用来自指定自然语言模型的一些基于字典的转换;和 U标签中每个字符的算术编码,其概率来自脱机训练(甚至可能是在线,但我怀疑数据可能太短而无法提供任何有意义的见解?)的上下文自适应自然语言模型。

3
基数排序的实际应用
当您知道键在某个有限范围内时,从根本上讲,基数排序非常快,例如,值在范围内。如果你只值转换为基础这需要时间,做了基础基数排序,然后再转换回原来的一个整体底座算法。[ 0 ... Ñ ķ - 1 ] ķ &lt; LG Ñ Ñ Θ (Ñ )ñ Θ (Ñ ķ )ñnn[ 0 … nķ− 1 ][0…nk−1][0\dots n^k -1]k &lt; lgñk&lt;lg⁡nk<\lg nñnnΘ (n )Θ(n)\Theta(n)ñnnΘ (千k )Θ(nk)\Theta(nk) 但是,我已经读到,实际上,基数排序通常比进行随机化的quicksort慢得多: 对于大型阵列,基数排序的指令数最少,但是由于其相对较差的缓存性能,其总体性能比合并排序和快速排序的内存优化版本差。 基数排序只是一种很好的理论算法,还是有通用的实际用途?

2
使用Bellman Ford获得负循环
我必须在有向加权图中找到一个负周期。我知道Bellman Ford算法是如何工作的,它告诉我是否存在可达到的负周期。但是它没有明确命名。 如何获取循环的实际路径?v1,v2,…vk,v1v1,v2,…vk,v1v1, v2, \ldots vk, v1 应用标准算法后,我们已经进行了次迭代,因此不可能进一步改进。如果我们仍然可以降低到节点的距离,则存在负循环。n−1n−1n-1 我的想法是:由于我们知道仍然可以改善路径的边缘,并且知道每个节点的前身,因此我们可以从该边缘追溯到直到再次遇到它为止。现在我们应该有一个循环。 可悲的是,我没有找到任何可以告诉我这是否正确的论文。那么,它真的像那样工作吗? 编辑:此示例证明我的想法是错误的。给定下图,我们从节点运行Bellman-Ford 。1个11 我们按的顺序处理边缘。经过次迭代后,我们得到节点距离:n − 1a ,b ,c ,da,b,c,da, b, c, dn − 1n−1n-1 2 :- 30 3 :- 151:−51:−51: -5 2:−302:−302: -30 3:−153:−153: -15 和父表:有父有父有父 3 2 3 3 2111333 222333 333222 现在,进行第次迭代,我们发现仍可以使用边沿改善节点的距离。因此,我们知道存在一个负循环,而是其中的一部分。1 一个一个nnn111aaaaaa 但是,通过追溯到父表的方式,我们陷入了另一个负循环,再也不会相遇。一c,dc,dc, daaa 我们如何解决这个问题?

3
如何严格制定一个计算问题?
我经常与想问一个关于计算问题(或其复杂性)的算法的人互动,但是他们并没有以一种严格的方式来表达我们(计算机科学家)可以理解的方式。 用CLRS之类的书来引用它们是没有帮助的,因为那里的示例通常有一种非常直接的方式来严格地陈述,例如,给定一个图的邻接列表,并且图中的两个顶点计算出这些顶点之间的最短路径。 是否有任何一本好书(或其他资源),使对CS知识最少的人可以学习如何以计算机科学家可以理解的严格方式来表述和陈述计算问题? 最好,这本书应该有许多示例,这些示例如何从各个领域和现实世界的示例中严格地阐述计算问题。 澄清度 为了使问题更具体,让我们假设他们了解1/2年级本科CS学生的基本数学/ CS术语,例如集合,函数,图形,列表等(我所拥有的人就是这种情况)心神)。例如,他们阅读了一些入门性教科书,例如Aho和Ullman(尽管他们可能还没有完全理解它)。 Al Aho和Jeff Ullman,计算机科学基金会,1992年。

1
是否在检测“双重”算术级数3SUM困难?
这是受采访问题启发的。 我们给出一个整数数组并且必须确定是否有不同的使得 i &lt; j &lt; ka1,…,ana1,…,ana_1, \dots, a_ni&lt;j&lt;ki&lt;j&lt;ki \lt j \lt k ak−aj=aj−aiak−aj=aj−aia_k - a_j = a_j - a_i k−j=j−ik−j=j−ik - j = j - i 也就是说,序列和都在算术级数上。{ 我,Ĵ ,ķ }{ a一世,一Ĵ,一ķ}{ai,aj,ak}\{a_i, a_j, a_k\}{ i ,j ,k }{i,j,k}\{i,j,k\} 有一个简单的算法,但是找到次二次算法似乎很困难。Ø (ñ2)O(n2)O(n^2) 这是一个已知问题吗?我们可以证明这一点的3SUM难度吗?(或者提供次二次算法?) 如果愿意,可以假定,并且对于已知常数。(在面试问题中,)。一个[R + 1 - 一- [R ≤ ķ ķ …

1
基于分区细化的算法比对数线性时间运行更快的问题
分区优化是一种从有限的对象集开始并逐步拆分对象集的技术。使用分区细化可以非常有效地解决某些问题(例如DFA最小化)。除了Wikipedia页面上列出的问题之外,我不知道通常可以使用分区优化来解决任何其他问题。在所有这些问题中,维基百科页面提到了两个基于线性分区优化的算法。有按字典顺序排序的拓扑排序[1]和按字典广度优先搜索的算法[2]。 是否还有其他示例或对可以使用分区细化有效解决的问题的引用,这在时间上比对数线性好? [1] Sethi,Ravi,“在两个处理器上调度图形”,SIAM计算杂志5(1):73-82,1976年。 [2] Rose,DJ,Tarjan,RE,Lueker,GS,“图上顶点消除的算法方面”,SIAM计算杂志5(2):266-283,1976。

3
寻找离散对数有多难?
的离散对数是相同的发现在给出,Ç,和Ñ。a b = c mod N a c Nbbbab=cmodNab=cmodNa^b=c \bmod NaaacccNNN 我想知道这属于什么复杂度组(例如,对于经典计算机和量子计算机),以及哪种方法(即算法)最适合完成此任务。 上面的Wikipedia链接并没有给出非常具体的运行时。我希望找到最类似的方法来找到这种方法。

2
如何描述算法,证明和分析算法?
在阅读计算机编程艺术(TAOCP)之前,我没有深入考虑这些问题。我将使用伪代码来描述算法,理解算法并仅估计增长顺序的运行时间。该TAOCP彻底改变了我的脑海里。 TAOCP使用英语加上步骤和goto来描述算法,并使用流程图更轻松地描绘算法。似乎是低级的,但是我发现有一些优点,尤其是流程图,我已经忽略了很多。我们可以在计算遍历该箭头时用关于当前事务状态的断言标记每个箭头,并为该算法提供归纳证明。作者说: 作者的争论是我们真正理解为什么只有当我们达到了我们的思想隐含地填充所有断言的程度时算法才是有效的方法,如图4所示。 我还没有经历过这样的东西。另一个优点是,我们可以计算每个步骤执行的次数。用基尔霍夫的第一定律很容易检查。我没有精确地分析运行时间,因此在估算运行时间时可能会省略一些。±1±1\pm1 分析增长顺序有时是无用的。例如,由于它们都是,因此我们无法区分quicksort和heapsort ,其中是期望的随机变量,因此我们应该分析常数,例如,和,因此我们可以比较和更好。而且,有时我们应该比较其他数量,例如方差。仅对运行时间的增长顺序进行粗略分析是不够的。作为TAOCPE(T(n))=Θ(nlogn)E(T(n))=Θ(nlog⁡n)E(T(n))=\Theta(n\log n)EXEXEXXXXE(T1(n))=A1nlgn+B1n+O(logn)E(T1(n))=A1nlg⁡n+B1n+O(log⁡n)E(T_1(n))=A_1n\lg n+B_1n+O(\log n)E(T2(n))=A2lgn+B2n+O(logn)E(T2(n))=A2lg⁡n+B2n+O(log⁡n)E(T_2(n))=A_2\lg n+B_2n+O(\log n)T1T1T_1T2T2T_2 将算法翻译成汇编语言并计算运行时间,这对我来说太难了,所以我想知道一些技术来更粗略地分析运行时间,这对于C,C ++等高级语言也很有用或伪代码。 我想知道研究工作中主要使用哪种描述风格,以及如何处理这些问题。

4
如何使用贪心算法找到最接近给定序列的非递减序列?
a1,…,ana1,…,ana_1, \ldots, a_n000lllaiaia_ibibib_i000lllbibib_ib i O (n 4max(|a1−b1|,…,|an−bn|)max(|a1−b1|,…,|an−bn|)\max(|a_1-b_1|, \ldots, |a_n-b_n|)bibib_iO(nl√4)O(nl4)O(n\sqrt[4]{l}) 老实说,我根本不知道如何开始解决这个问题。在我看来,这似乎是一个动态编程问题,但这位教授说,应该使用贪婪算法解决该问题。如果有人可以给我一点点提示就可以指出正确的方向,那将不胜感激。

3
可证明更快的随机算法在P中的问题
中是否存在任何问题,这些问题使随机算法超过了确定性算法的下限?更具体地讲,我们知道任何针对?这里表示由随机TM决定的语言集,在f(n)个步骤中具有恒定边界(一侧或两侧)错误。PP\mathsf{P}kkkP Ť 我中号È(˚F (Ñ ))˚F (Ñ )DTIME(nk)⊊PTIME(nk)DTIME(nk)⊊PTIME(nk)\mathsf{DTIME}(n^k) \subsetneq \mathsf{PTIME}(n^k)PTIME(f(n))PTIME(f(n))\mathsf{PTIME}(f(n))f(n)f(n)f(n) \ mathsf {P}内的随机性会给我们买任何东西PP\mathsf{P}吗? 明确地说,我正在寻找一种差异是渐近的(最好是多项式,但我会采用多元对数),而不仅仅是一个常数。 在最坏的情况下,我正在渐进地寻找算法。具有更高预期复杂度的算法不是我想要的。我指的是RP或BPP中的随机算法,而不是ZPP。

2
如何设计一种算法来在屏幕上排列(可调整大小的)窗口以覆盖尽可能多的空间?
我想编写一个简单的程序,该程序接受一组窗口(宽度+高度)和屏幕分辨率,并在屏幕上输出这些窗口的排列,以使窗口占用最大的空间。因此,可以在保持output size &gt;= initial size纵横比的同时调整窗口的大小 。所以对于窗口iii,我希望该算法返回一个元组(x ,y,w ^ 我d吨ħ ,ħ È 我克ħ 吨)(x,y,width,height)(x, y, width, height)。 我相信这可能是2D背包的变形。我曾尝试遍历整个网络的结果,但是它们大多数都有很多背景(并且没有实现),这使我难以理解。 我对最快的算法不太感兴趣,但对满足我的特定需求的实用工具却更感兴趣。

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.