Questions tagged «algorithms»

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

3
使用后缀数组计算两个字符串的最长公共子字符串
在学习了如何以复杂度构建后缀数组之后,我对发现后缀数组的应用感兴趣。其中之一是在时间中找到两个字符串之间最长的公共子字符串。我在互联网上发现以下算法:O(N)O(N)O(N)O(N)O(N)O(N) 将两个字符串和合并为一个字符串AAABBBABABAB 计算的后缀数组ABABAB 计算(最长公共前缀)数组LCPLCPLCP 答案是最大值LCP[i]LCP[i]LCP[i] 我尝试实现它,但是由于没有说很多实现细节(即,在连接字符串时,是否应该在它们之间加上一个特殊字符()?),我的代码在许多测试用例上均失败了。有人可以详细说明一下该算法吗?AcBAcBAcB 提前致谢。 注意:我不保证该算法的正确性;我在博客上找到了它,但不确定它是否有效。如果您认为它不正确,请提出另一种算法。

2
这个显然是O(n lg n)乘法算法的错误在哪里?
最近一篇有关找到三个等距间隔的难题的博客文章将我引向一个stackoverflow问题,该问题的最高答案声称是在O(n lg n)时间内完成的。有趣的是,该解决方案涉及对多项式求平方,并参考描述了如何在O(n lg n)时间内进行的论文。 现在,多项式相乘实际上与数字相乘。唯一真正的区别是缺少携带。但是...进位也可以在O(n lg n)时间内完成。例如: var value = 100; // = 0b1100100 var inputBitCount = value.BitCount(); // 7 (because 2^7 > 100 >= 2^6) var n = inputBitCount * 2; // 14 var lgn = n.BitCount(); // 4 (because 2^4 > 14 => 2^3) var c = …

1
在有向图中找到简单循环
对我来说,这个问题看起来很有趣。它将在有向图中找到一个简单的循环(即没有重复节点的循环)。 我的解决方案是这样的,即此图是一个案例问题: 我知道图形中有一个循环,当您可以在深度优先搜索中找到“后边缘”时(在DFSTree的图片中虚线了),我可以确定几个循环,但不能确定所有,简单的周期。因为,有向植物非常重要,所以从一个周期开始,即(0123)!=(0321) 我正在考虑为每个具有后端的节点创建dfs,但是我不确定,目前尚不清楚。所以,我问你,如果你指导我。谢谢!。 这是我针对案例问题的简单循环计数。

6
会有一个完美的国际象棋算法吗?
当前的国际象棋算法根据玩家的移动和对手的移动在可能的路径树上向下移动约1或2个级别。假设我们具有计算能力,可以开发一种预测象棋游戏中对手所有可能动作的算法。该算法具有对手在任何给定时刻可以采取的所有可能路径的算法,具体取决于玩家的移动。有没有一种完美的国际象棋算法,永不丢失?还是永远赢的算法?我的意思是说,理论上可以预测所有可能动作的人必须能够找到一种方法来击败每一步,或者如果某个人肯定会导致他失败,那么他只能选择一条不同的道路..... 编辑-我的问题确实是什么。假设我们具有可以发挥最佳性能的完美算法的计算能力。当对手使用相同的最佳算法时会发生什么?这也将适用于所有2个具有有限数量(无论是否大)移动的玩家游戏。会有永远赢的最佳算法吗? 个人定义:最优算法是永远赢的完美算法(不是永远不会输的赢,而是永远赢的赢的算法)

2
为什么主定理中存在规则性条件?
我一直在阅读Cormen等人的算法简介。并且我正在阅读从第73页开始的Master定理的陈述。在情况3中,使用定理还需要满足一个正则条件: ... 3.如果 F(n )= Ω (n日志ba + ε)F(ñ)=Ω(ñ日志b⁡一种+ε)\qquad \displaystyle f(n) = \Omega(n^{\log_b a + \varepsilon}) 对于一些恒定,如果ε &gt; 0ε&gt;0\varepsilon > 0 一个˚F(Ñ / b )≤ Ç ˚F(n )一种F(ñ/b)≤CF(ñ)\qquad \displaystyle af(n/b) \leq cf(n) [ 这是规律性条件 ] 对于某些常数以及对于所有足够大的,则..Ñc &lt; 1C&lt;1c < 1ññn 有人可以告诉我为什么需要规律性条件吗?如果不满足条件,定理将如何失败?

4
给定一组集合,从每个集合中找出包含至少一个元素的最小集合
给定一组套,我想找到一套,使得每一套在包含至少一个元素。我还希望在满足此标准的同时包含尽可能少的元素,尽管可能存在不止一个具有此属性的最小(解决方案不一定是唯一的)。S小号\mathbf{S}S S M M MM中号MS小号SS小号\mathbf{S}M中号MM中号MM中号M 作为一个具体的例子,假设一套是一组的国旗,并为每个标志在,元素是在该国的国旗使用的颜色。美国将具有而摩洛哥将具有。那么将是一组颜色,其属性是每个国旗至少使用一种颜色。(奥林匹克颜色蓝色,黑色,红色,绿色,黄色和白色是这种的示例,至少在1920年是这样。) S S S = { r e dS小号\mathbf{S}S小号SS小号\mathbf{S}S = { r e d ,g r e e n } M M MS={red,瓦特ħ 我吨e,blue}小号={[RËd,wH一世ŤË,b升üË}S = \{red, white, blue\}S={red,g[Reen}小号={[RËd,G[RËËñ}S = \{red, green\}M中号MM中号MM中号M 这个问题有通用名称吗?是否有公认的“最佳”算法来查找集合?(我对解决方案本身更感兴趣,而不是对计算复杂度进行优化。)M中号M

1
所有士兵应同时射击
当我还是一名学生时,我在数字系统/逻辑设计教科书中看到一个问题,关于N名士兵连续站立并想同时射击。问题的一个更困难的版本是士兵们站在一个通用的网络中而不是排成一排。我确定这是一个经典问题,但我不记得它的名字了。你能提醒我吗?

1
在树中找到从根到叶的最长路径
我有一棵树(在图论的意义上),例如以下示例: 这是一棵有向树,有一个开始节点(根)和许多结束节点(叶)。每个边都有指定的长度。 我的问题是,如何找到从根到叶的最长路径?蛮力方法是检查所有的根叶路径,并采用最大长度的路径,但是如果有的话,我更喜欢一种更高效的算法。

2
具有扫描线算法的圆交集
不幸的是,我对扫描线算法的理解还不是很强。关于该主题的所有论文和教科书均已阅读,但理解距离还很远。为了更清楚一点,我尝试解决尽可能多的练习。但是,真正有趣和重要的任务仍然对我构成挑战。 我在万能杰夫·埃里克森(Jeff Erickson)的《线段相交》的讲义中发现了以下练习。 练习2。描述并分析扫掠线算法,以在给定平面中的圆的情况下确定在时间内是否有两个相交。每个圆都由其中心和半径指定,因此输入由三个数组和。注意正确实现低级原语。ññnØ (ñ 日志n )Ø(ñ日志⁡ñ)O(n \log n)X[ 1 .. n ] ,Y[ 1 .. n ]X[1 ..ñ],ÿ[1 ..ñ]X[1.. n], Y [1.. n]R [ 1 .. n ][R[1 ..ñ]R[1.. n] 让我们尝试使复杂的事情变得容易。我们对圆的交点了解多少?用线的交点可以找到什么类似物。如果两条线相邻,两条线可能会相交,两条圆应该具有哪个属性才能相交?令为圆心,和圆心之间的距离。考虑几种情况:ddd[R0[R0r_{0}[R1[R1r_{1} 情况1:如果,则没有解,圆是分开的。d&gt; r0+ r1d&gt;[R0+[R1d > r_{0} + r_{1} 情况2:如果那么就没有解决方案,因为一个圆包含在另一个圆内。d&lt; |[R0- - [R1|d&lt;|[R0-[R1|d < |r_{0} - r_{1}| 情况3:如果且则圆是重合的,并且解的数量是无限的。d= 0d=0d = …

3
如何解决动态图相关问题
我在通用stackoverflow上问了这个问题,我被引导到这里。 如果有人可以解释通常如何解决部分或完全动态图问题,那将是很好的。 例如: 当在每个实例上删除一条边时,在实例的无向加权图中的两个顶点之间找到最短路径。n(u ,v )(ü,v)(u,v)ññn 当在每个实例上移除一条边等时,找到n个实例在无向图中的连接组件数。 我最近在编程竞赛中遇到了这类问题。我在网上搜索,发现了很多有关动态图的研究论文[1,2]。我读了其中的几本书,却找不到直接的东西(聚类,稀疏化等)。很抱歉含糊。 如果有人可以提供一些指针来更好地理解这些概念,我将非常感谢。 D.Eppstein,Z.Galil,GF Italiano(1999)的动态图算法 G. Nannicini,L。Liberti(2008)在动态图上的最短路径

3
是否可以遍历一棵树而无需递归,堆栈或队列,而只需几个指针?
半年前,我坐在一个数据结构课上,如果有人可以在不使用递归,堆栈,队列等(或任何其他类似数据结构)而仅使用几个指针的情况下遍历一棵树,教授将提供额外的荣誉。我想出了一个我认为是对这个问题的明显答案,最终被教授接受了。我和同一系的另一位教授坐在一门离散数学课上,他断言没有递归,堆栈,队列等就不可能遍历一棵树,而且我的解决方案无效。 那么,有可能还是不可能?为什么或者为什么不? 编辑:为澄清起见,我在具有三个元素的二叉树上实现了这一点-每个节点上存储的数据和指向两个孩子的指针。我的解决方案仅需少量更改即可扩展到n元树。 我的数据结构老师没有对树的变异施加任何限制,实际上,后来我发现他自己的解决方案是使用子指针在回落的过程中指向树的后方。我的离散数学教授说,根据树的数学定义,树的任何突变都意味着它不再是树,他的定义还将排除指向父代的任何指针,这与我上面解决它的情况相符。

2
堆-给出
最有可能在问过这个问题。来自CLRS(第二版)问题6.5-8- 给出一个时间算法,将k个排序列表合并为一个排序列表,其中n是所有输入列表中元素的总数。(提示:请使用最小堆进行k向合并。)O(nlgk)O(nlg⁡k)O(n \lg k)kkknnnkkk 由于有排序的列表且总共有n个值,所以我们假设每个列表包含n个kkknnn数字,而且每个列表都严格按升序排序,结果也将按升序存储。nknk\frac{n}{k} 我的伪代码看起来像这样- list[k] ; k sorted lists heap[k] ; an auxiliary array to hold the min-heap result[n] ; array to store the sorted list for i := 1 to k ; O(k) do heap[i] := GET-MIN(list[i]) ; pick the first element ; and keeps track of …

5
图中负权重边的重要性是什么?
我进行了动态编程练习,发现了Floyd-Warshall算法。显然,它找到了图的所有对最短路径,其权重边可能为负,但没有负周期。 所以,我想知道负重边的现实意义是什么?简单的英语解释会有所帮助。

2
该程序会为每个整数终止吗?
在GATE准备的零件测试中,存在一个问题: f(n): if n is even: f(n) = n/2 else f(n) = f(f(n-1)) 我回答“它将终止于所有整数”,因为即使对于某些负整数,它将终止为Stack Overflow Error。 但是我的朋友不同意说,由于这不是实现的代码,而只是伪代码,因此在某些负整数的情况下将是无限递归的。 哪个答案正确,为什么?


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.