Questions tagged «algorithms»

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

2
对5个整数进行排序,最多7个比较
如何排序5个整数的列表,以便在最坏的情况下需要进行7个比较?我不在乎执行了多少其他操作。我对整数没有什么特别的了解。 我尝试了几种不同的分而治之方法,这些方法使我只能进行8次比较,例如遵循mergesort方法,或者将mergesort与使用二进制搜索来组合以找到插入位置,但是每次我得到8次结果时,都会比较最坏的情况。 现在,我只是在寻找提示,而不是解决方案。

1
Ukkonen算法的运行时间如何取决于字母大小?
我担心Ukkonen算法的渐近运行时间问题,它可能是在线性(?)时间构造后缀树的最流行算法。 这是丹·古斯菲尔德(Dan Gusfield)撰写的《关于字符串,树和序列的算法》(第6.5.1节)的引用: “ ... Aho-Corasick,Weiner,Ukkonen和McCreight算法都需要空间,或者O (m )时限应替换为O (m log m )和O的最小值(m log | Σ |) ”。Θ (m | Σ |)Θ(米|Σ|)\Theta(m|\Sigma|)O (米)Ø(米)O(m)Ø (米日志m )Ø(米日志⁡米)O(m \log m)Ø (米日志| Σ | )Ø(米日志⁡|Σ|)O(m \log|\Sigma|) [ 是字符串长度,Σ是字母的大小]米米mΣΣ\Sigma 我不明白为什么这是真的。 空间:好吧,如果我们使用大小为数组表示节点外的分支,那么实际上,我们最终会占用Θ (m | Σ |)空间。但是,据我所知,还可以使用哈希表(例如Python中的字典)存储分支。这样一来,我们将只将Θ (m )指针存储在所有哈希表中(因为树中有Θ (m )个边),同时仍然能够访问O (1 )中的子节点。Θ(|Σ|)Θ(|Σ|)\Theta(|\Sigma|)Θ (米|Σ|)Θ(m|Σ|)\Theta(m|\Sigma|)Θ (米)Θ(m)\Theta(m)Θ (米)Θ(米)\Theta(m)Ô (1 )Ø(1个)O(1) …


1
生成用于随机测试图算法的输入?
在测试算法时,一种常见的方法是随机测试:根据某种分布(通常是均匀的)生成大量输入,对它们运行算法并验证正确性。给定算法签名,现代测试框架可以自动生成输入,但有一些限制。 如果输入是数字,列表或字符串,则直接生成此类输入。树比较难,但仍然很容易(使用随机的无上下文语法或类似方法)。 如何有效地生成随机图?通常,随机地均匀地选择图形不是您想要的:它们应该是连接的,平面的,无循环的或具有任何其他属性。由于潜在的大量不良图集,拒绝采样似乎次优。 有哪些有用的发行版可以查看?在这里有用意味着 这些图很可能很好地测试了算法 它们可以有效地产生。 我知道有很多用于随机图的模型,因此我希望能从中获得一些最了解图的模型的见解。 如果“某些算法”过于笼统,请使用最短路径查找算法作为测试中的具体算法类别。用于测试的图应该是连通的并且相当密集(具有很高的概率,或者至少在预期中)。对于测试,最佳解决方案是围绕最短路径创建随机图,以便我们知道所需的结果(而不必采用其他算法)。


5
二部图的最大独立集
我正在尝试寻找Biparite图的最大独立集。 在“ 1998年5月13日-华盛顿大学-CSE 521-网络流的应用”的一些注释中,我发现以下内容: 问题: 给定一个二分图G=(U,V,E)G=(U,V,E)G = (U,V,E),找到一组独立的U′∪V′U′∪V′U' \cup V'这是尽可能大的,在那里U′⊆UU′⊆UU' \subseteq U和V′⊆VV′⊆VV' \subseteq V。如果集合的元素之间没有EEE边,则集合是独立的。 解: 构造上的顶点的流图U∪V∪{s,t}U∪V∪{s,t}U \cup V \cup \{s,t\}。对于每个边缘(u,v)∈E(u,v)∈E(u,v) \in E有一个无限容量边缘从uuu到 vvv。对于每个u∈Uu∈Uu \in U,存在从单元容量边缘sss到uuu,并且对于每个v∈Vv∈Vv \in V,存在从单元容量边缘vvv到 ttt。 查找有限容量切口(S,T)(S,T)(S,T),与s∈Ss∈Ss \in S和t∈Tt∈Tt \in T。让 U′=U∩SU′=U∩SU' = U \cap S和V′=V∩TV′=V∩TV' = V \cap T。该组U′∪V′U′∪V′U' \cup V',因为没有无限容量的边缘交叉的切断是独立的。切口的大小是|U−U′|+|V−V′|=|U|+|V|−|U′∪V′||U−U′|+|V−V′|=|U|+|V|−|U′∪V′||U - U'| + |V - V'| …

3
线分隔两组点
是否有办法确定两条点是否可以用一条线分开? 我们有两套分的和是否有分开的线路和,使得所有的点,只有上线的一侧,所有的点,只有在另一边。B A B A A B B一种AA乙BB一种AA乙BB一种AA一种AA乙BB乙BB 我想到的最幼稚的算法是为和构建凸多边形,并测试它们的交集。看起来时间像构造凸多边形一样,其时间复杂度应为。实际上,我不希望时间复杂度有任何改善,我不确定它是否可以改善。但是,至少应该有一种更漂亮的方法来确定是否有这样一条线。B O (n log h )一种AA乙BBØ (ñ 日志h )O(nlog⁡h)O(n\log h)

2
无向图上的最短路径?
所以我认为这个(虽然有些基本)问题属于这里: 假设我有一个大小为100的节点的图,以10x10的模式排列(请考虑棋盘)。该图是无向的和未加权的。在图形中移动涉及向前移动三个空间,向右或向左移动一个空间(类似于国际象棋骑士在棋盘上的移动方式)。 给定一个固定的开始节点,人们将如何找到通往板上其他任何节点的最短路径? 我以为可行的移动节点之间只有一条边。因此,鉴于此信息,我希望找到从起始节点到结束节点的最短路径。 我最初的想法是每条边的权重均为1。因此,我决定使用深度优先搜索的更改形式来进行此操作。 但是,我无法终生想象如何使用搜索获得最短路径。 我尝试的另一件事是将图以树形图作为起始节点作为根,然后选择最浅的(最低的行号)结果,该结果为我提供了所需的结束节点……这是可行的,但是效率极低,因此不适用于较大的图形。 有没有人有任何想法可以为我指出正确的方向? 非常感谢你。 (我试图对图表进行可视化处理,但由于声誉低下而无法执行)

3
给定半径的最大封闭圆
我尝试找到解决以下问题的方法: 给定点和半径的集合,找到圆的中心点,以使圆包含该集中的最大点数。运行时间应为。ř ø (Ñ 2)小号SS[RrrO (ñ2)O(n2)O(n^2) 起初,这似乎类似于最小的封闭圆问题,可以轻松地在。这个想法是要设定一个任意的中心并环绕所有点。接下来,逐步替换圆以触摸最左/最右的点,然后将圆缩小到给定的半径,这显然是行不通的。SO (ñ2)O(n2)O(n^2)小号SS

1
分布式alpha beta修剪
我正在寻找一种有效的算法,该算法可让我在分布式体系结构上使用alpha-beta修剪来处理国际象棋的minimax搜索树。我发现的算法(PVS,YBWC,DTS见下文)都已经很老了(1990年是最新的)。我认为自那时以来已经有了许多实质性的进步。目前该领域的标准是什么? 另外,请指出白痴对DTS的解释,因为我从阅读的研究论文中无法理解它。 上面提到的算法: PVS:原则变化分裂 YBWC:青年兄弟等待概念 DTS:动态树拆分 全部都在这里讨论。

2
类型检查算法
我正在开始有关类型检查算法的个人书目研究,并需要一些技巧。最常用的类型检查算法,策略和通用技术是什么? 我对以众所周知的强静态类型化语言(例如C ++,Java 5 +,Scala或其他语言)实现的复杂类型检查算法特别感兴趣。IE,由于基础语言的键入非常简单(例如Java 1.4及更低版本),因此类型检查算法不是很简单。 我本身对特定的语言X,Y或Z并不感兴趣。我对类型检查算法感兴趣,无论它们针对的是哪种语言。如果您提供诸如“您从未听说过的语言L是强类型且类型复杂的答案”,则可以使用类型检查算法,该算法通过使用算法Z检查X和Y来进行A,B和C运算,或者“用于Scala的策略X和Y以及用于C#的A的变体Z都很酷,因为R,S和T功能以这种方式起作用”,那么答案就很好。

5
动态编程的案例区分:需要示例!
我从事动态编程已有一段时间了。评估动态编程递归的规范方法是创建一个包含所有必要值的表,并将其逐行填充。有关简介,请参见例如Cormen,Leiserson等人:“算法简介”。 我将重点放在二维(逐行填充)的基于表的计算方案上,并研究单元格依存关系的结构,即在计算另一个单元格之前需要完成哪些单元格。我们用表示Γ(i)Γ(i)\Gamma(\mathbf{i})单元格ii\mathbf{i}依赖的单元格的索引集。请注意,ΓΓ\Gamma必须是无周期的。 我从计算出的实际函数中抽象出来,并专注于其递归结构。形式上,如果递归具有以下形式,则我认为它ddd是动态编程 d(i)=f(i,Γ˜d(i))d(i)=f(i,Γ~d(i))\qquad d(\mathbf{i}) = f(\mathbf{i}, \widetilde{\Gamma}_d(\mathbf{i})) 与,〜Γ d(我)= { (Ĵ,d (Ĵ))| Ĵ ∈ Γ d(我)}和˚F一些(可计算)函数,它不使用ð比通过其他〜Γ d。i∈[0…m]×[0…n]i∈[0…m]×[0…n]\mathbf{i} \in [0\dots m] \times [0\dots n]Γ˜d(i)={(j,d(j))∣j∈Γd(i)}Γ~d(i)={(j,d(j))∣j∈Γd(i)}\widetilde{\Gamma}_d(\mathbf{i}) = \{(\mathbf{j},d(\mathbf{j})) \mid \mathbf{j} \in \Gamma_d(\mathbf{i}) \}fffdddΓ˜dΓ~d\widetilde{\Gamma}_d 当限制的粒度粗糙区域(左侧,左上,上,右上,...当前单元格)的一个观察到有三个基本例(高达对称性和旋转)的有效动态编程递归,通知如何填充表:ΓdΓd\Gamma_d 红色区域表示(近似)。情况一和二承认子集,情况三是最坏的情况(直到索引转换)。注意,并非严格要求整个红色区域都被Γ覆盖;表格每个红色部分中的一些单元格足以将其涂成红色。明确要求白色区域不包含任何必需的单元格。ΓΓ\GammaΓΓ\Gamma 第一种情况的示例是编辑距离和最长公共子序列,第二种情况适用于Bellman&Ford和CYK。不太明显的例子包括:对角线而不是行(或列),因为它们可以旋转以适应所提出的情况;有关示例,请参见乔的答案。 不过,对于情况三,我没有(自然的)例子!所以我的问题是:案例三的动态编程递归/问题有哪些示例?

6
动态编程与蛮力编程有何不同
当我遇到以下引用时,我正在阅读动态编程 动态编程算法将研究解决问题的所有可能方法,并选择最佳解决方案。因此,我们可以将动态编程粗略地认为是一种智能的,蛮力的方法,它使我们能够通过所有可能的解决方案来选择最佳方案。如果问题的范围如此之大,以至于可以快速解决所有可能的解决方案,那么动态编程可确保找到最佳解决方案 给出了以下示例 例如,假设您必须在高峰时段在给定的城市中尽快从A点到达B点。动态规划算法将调查整个交通报告,调查您可能会走的所有可能的道路组合,然后才告诉您哪种方式最快。当然,您可能需要等待一段时间才能完成算法,然后才能开始驾驶。您将采用的路径将是最快的路径(假设外部环境没有任何变化) 蛮力在决定最佳解决方案之前,正在尝试所有可能的解决方案。 如果动态编程在选择最佳解决方案之前也要通过所有可能的解决方案,那么它与Brute Force 有何不同,我看到的唯一区别是动态编程考虑了其他因素(在这种情况下为交通状况)。 我正确地说动态编程是蛮力方法的子集吗?

1
有效地计算或近似神经网络的VC维
我的目标是解决以下问题,该问题已由其输入和输出描述: 输入: 一个有节点,源和宿的有向无环图()。GGGmmmnnn111m>n≥1m>n≥1m > n \geq 1 输出: 具有拓扑的神经网络的VC维(或其近似值)。GGG 更多细节: 中的每个节点都是一个S型神经元。拓扑是固定的,但是边缘的权重可以通过学习算法来改变。GGG 学习算法是固定的(例如向后传播)。 所述源节点是输入神经元和只能坐从串{ - 1 ,1 } Ñ作为输入。ññn{ - 1 ,1 }ñ{-1个,1个}ñ\{-1,1\}^n 接收器节点是输出单元。它输出从实际值,我们四舍五入到1或向下- 1如果它是大于某一固定阈值δ远离0。[ - 1 ,1 ][-1个,1个][-1,1]1个1个1− 1-1个-1δδ\delta000 天真的方法只是试图通过尝试在这些点上训练网络来打破越来越多的点。但是,这种模拟方法效率不高。 题 有没有一种有效的方法来计算此函数(例如,在更改为决策问题:VC维度小于输入参数k吗?)?如果不是,是否有硬度结果?PP\mathsf{P}ķķk 有没有一种行之有效的方法来计算或近似该函数?如果是近似值,是否可以保证其准确性? 笔记 我对stats.SE 提出了类似的问题,但没有引起任何兴趣。


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.