Questions tagged «algorithms»

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


1
寻找最长的重复子序列
给定字符串,我想找到最长的重复(至少两次)子序列。也就是说,我想找到一个字符串,它是的子序列(不一定是连续的),使得。也就是说,是一个字符串,其一半连续出现两次。请注意,是的子序列,但不一定是子字符串。ssswwwsssw=w′⋅w′w=w′⋅w′w=w' \cdot w' wwwwwwsss 例子: 对于“ ababccabdc”,它将是“ abcabc”,因为“ abc” =“ abc”和“ abc”在“ ababccabdc”中(至少)出现了两次(至少)。 对于“ addbacddabcd”,一个选项为“ dddd”,因为“ dd”出现两次(我不能多次使用相同的字母,但是这里我有4个“ d”,所以还可以),但其值为4。我可以找到更好的一个长度8:“ abcdabcd”,因为“ abcd”是“ addbacddabcd”的子字符串,该子字符串出现两次。 我有兴趣找到最长的重复子序列。这也称为“找到最长/最大的平方”,但我读过许多文章,其中为子字符串而不是子序列定义了平方。 我可以轻松地使用蛮力算法,该算法通过迭代字符串中的断点的所有选项来获取,然后我将在两个字符串中寻找最大/最长的公共子序列,但是使用动态编程技术每次检查将花费,因此整个时间将是。我发现了最长公共子序列更有效的算法,该算法采用,因此运行时间将为。O(n3)O(n3)O(n^3)O(n2)O(n2)O(n^2)O(n3)O(n3)O(n^3)O(n2logn)O(n2log⁡n)O(\frac{n^2}{\log n})O(n3logn)O(n3log⁡n)O(\frac{n^3}{\log n}) 我正在寻找一种更有效的算法来解决最长重复子序列问题。也许我对所有断点进行迭代的想法浪费了太多时间,并且可以减少为更少的迭代。或者也许以不同的态度解决这个问题。 我搜索了许多期刊和以前的问题,发现的大多数结果都与子字符串有关,而不是与子序列有关。 我还读到可以使用后缀树来完成此操作,但这也与子字符串有关,我不确定是否可以将这种想法扩展到子序列。 我正在寻找可以在时间中运行的解决方案。如果在时间上存在一个会更好(我不确定是否存在)。O(n2)O(n2)O(n^2)O(n⋅logn)O(n⋅log⁡n)O(n \cdot \log n)

1
您如何确定Welch-Berlekamp算法中的错误数量?
在用于解码Reed-Solomon码的Welch-Berlekamp算法中,给出了一个点列表,该点(一个一世,b一世)(ai,bi)(a_i, b_i)表示未知位置b i上有Ëee错误的消息(并且将e赋给该算法)。输出是通过所有给定点(发生错误的点除外)的多项式。b一世bib_iËee 该方法涉及求解形式为的线性方程组 b一世Ë(一个一世)= Q (a一世)biE(ai)=Q(ai)b_i E(a_i) = Q(a_i) 所有一世ii这里ËEE有度Ëee和问QQ具有至多度Ë + ke+ke+k。变量是ËEE和的系数问QQ。 为了确保ËEE具有度Ëee通常会在上述线性系统中加上的系数XËxex^e为1 的约束。但是,实际上并不一定知道Ëee。一个低效的(但仍多项式时间)的方式来解决这个问题是尝试Ëee所有值开始(n + k − 1 )/ 2 − 1(ñ+ķ-1个)/2-1个(n+k-1)/2 - 1,直到找到一个解下去。 我的问题是:确定方法是否更有效ËËe?或者,是否对线性系统进行了修改,以允许使用的上限ËËe而不是精确值? 特别是我想将此特定的解码器用于Reed-Solomon码,而不是基于其他技术的完全不同的算法。 为了回应DW的回答,这是我的工作示例。一切都以7为模。 plain message is: [2, 3, 2] polynomial is: 2 + 3 t^1 + 2 t^2 encoded message is: [[0, 2], [1, 0], …

3
如何使用图论解决法国国家档案馆的编排问题?
晚上好!我实际上是在法国国家档案馆实习,遇到一种想用图形解决的情况... 一,尘土飞扬的情况 我们希望根据图书的高度优化图书馆图书的排列方式,以最大程度地减少归档成本。书的高度和厚度是已知的。我们已经按照高度升序排列了这些书(我不知道这是不是最好的东西,但是...就是这样做的方法)。了解了每本书的厚度后,我们可以为每个类确定其排列所需的厚度,将其称为(例如,高的书的总厚度)。H i L i H i = 23H1个,小时2,… ,HñH1,H2,…,HnH_1,H_2,\dots,H_nH一世HiH_i大号一世LiL_iL i = 300H一世= 23ç 米Hi=23cmH_i = 23\,\mathrm{cm}大号一世= 300ç 米Li=300cmL_i = 300\,\mathrm{cm} 图书馆可以定制制造货架,指示所需的长度和高度(深度没有问题)。高度和长度货架的成本为 ,其中是固定成本,是每长度单位的货架成本。x i F i + C i x i F i C iH一世HiH_iX一世xix_iF一世+ C一世X一世Fi+CixiF_i+C_ix_iF一世FiF_iC一世CiC_i 需要注意的是高度的货架可以用来存储高度的书籍 与。我们希望将成本降到最低。^ h Ĵ Ĵ ≤ 我H一世HiH_iHĴHjH_jĴ ≤ 我j≤ij\leq i 我的老师建议我将此问题建模为寻路问题。该模型可能涉及索引为到个顶点。我的导师建议我计算现有条件,每个边的含义以及如何计算与边相关的评估。其他解决方案和见解也可以。0 n v …

1
最重的平面子图
考虑以下问题。 给定:边缘上具有真实非负权重的完整图形。 任务:找到最大权重的平面子图。(在所有可能的平面子图中为“最大”。) 注意:最大权重子图将是一个三角剖分;如果完整图在个顶点上,则它将具有m = 3 n - 6个边。ññnm = 3 n − 6米=3ñ-6m=3n-6 问题:解决此问题的最佳算法是什么?它的时间复杂度是多少?

2
向高中理科老师讲解SAT
我是一名对计算机科学感兴趣的高二学生。我为#SAT开发了一个很酷的算法,并且正在实施和进行一个科学展览项目。我的顾问是我学校最好的科学老师,也是AP Comp Sci老师,她告诉我,她完全不知道我的项目是什么,我需要简要向她解释为什么#SAT是在5分钟内很重要。我告诉她SAT简化为#SAT,并试图解释SAT为什么重要的原因:我给了她一些NP问题的例子,解释了她NP中的问题如何归结为SAT,并解释了如何通过二分搜索将某些优化问题归结为SAT ,它使您可以折叠蛋白质并建立强大的AI模型。不幸的是,她根本不了解我。你能给我一些建议吗? PS我的顾问问我,哪些有用的问题减少到#SAT,哪些没有减少到SAT(假设#P中的某些问题比相应的NP版本难一些)。我所能想到的就是找到给定数据集比给定模型更好的模型(假设模型的每个参数小于给定位数)。我在网上寻找其他人,但找不到任何我能理解的东西。还有其他好的应用程序吗?

4
元素唯一性可以在确定的线性时间内解决吗?
考虑以下问题: 输入:列出整数的X,YX,ÿX,Y 目标:确定两个列表中是否都存在整数。XXx 假设两个列表的大小均为n。是否存在确定性的线性时间算法来解决此问题?换句话说,您可以在不使用随机性的情况下确定地在O (n )时间内解决此问题吗?X,YX,ÿX,YññnO (n )Ø(ñ)O(n) 不幸的是,您不能假定列表元素都很小。 我可以看到如何使用随机算法在预期时间内求解它:随机选择一个2通用哈希函数h,将X的元素存储到哈希表中(使用h作为哈希函数),然后查找Y的每个元素以查看其是否在哈希表中。预期的运行时间为O (n )。但是,我看不到如何找到运行时间为O (n )的确定性算法。如果您尝试对此进行非随机化并修复单个特定的哈希函数,则将存在最坏情况的输入,导致此过程在O (n )Ø(ñ)O(n)HHhXXXHHhÿÿYO (n )Ø(ñ)O(n)O (n )Ø(ñ)O(n)时间。我能找到的最好的确定性算法涉及对值进行排序,但这不是线性时间。我们可以达到线性运行时间吗?Θ (n2)Θ(ñ2)\Theta(n^2) 另外,如果您假设所有列表元素都是范围内的整数(基本上,进行计数排序),我可以看到如何在线性时间内解决它-但我对一般情况会感兴趣我们无法假设的情况。[ 1 ,n ][1个,ñ][1,n] 如果答案取决于计算模型,那么您会想到RAM模型,但对于任何合理的计算模型,我都会对结果感兴趣。我知道用于元素唯一性的决策树算法的下界,但这不是确定的,因为有时即使在Ω (n log n )界中也可以找到线性时间算法决策树模型。Ω (n 对数n )Ω(ñ日志⁡ñ)\Omega(n \log n) Ω (n 对数n )Ω(ñ日志⁡ñ)\Omega(n \log n)

4
尽快找到五个小整数中的最大两个
我在小型嵌入式系统上对图像数据使用5交叉中值滤波器,即 x x x x x 该算法非常简单:读取5个无符号整数值,获得最大的2个值,对这些值进行一些计算,然后写回无符号整数结果。 好的是5个整数输入值都在0-20的范围内。计算出的整数值也在0-20范围内! 通过分析,我发现获得最大的两个数字是瓶颈,因此我想加快这一步。什么是执行此选择最快的方法? 当前算法使用由5个数字指定的位置中的1位的32位掩码和HW支持的CLZ函数。 我应该说CPU是专有的,在我公司之外无法使用。我的编译器是GCC,但为此CPU量身定制。 我试图弄清楚是否可以使用查找表,但未能生成可以使用的密钥。 我有输入组合,但顺序并不重要,即与相同。21521521^5[5,0,0,0,5][5,5,0,0,0] 碰巧下面的哈希函数会产生完美的哈希而不会发生冲突! def hash(x): h = 0 for i in x: h = 33*h+i return h 但是散列是巨大的,并且根本没有足够的内存来使用它。 我可以使用更好的算法吗?是否可以使用查找表并生成密钥来解决我的问题?

2
任意精度整数平方根算法?
是否有已知的次二次算法来计算n位整数的平方根的下限? 天真的算法是这样的 def sqrt(x): r = 0 i = x.bit_length() // 2 while i >= 0: inc = (r << (i+1)) + (1 << (i*2)) if inc <= x: x -= inc r += 1 << i i -= 1 return r 这需要O(n)迭代,每个迭代都涉及O(n)时间的增加,因此O(n^2)总的来说是时间。有什么更快的方法吗?我知道对于乘法来说,有一些特殊的算法比二次时间要好,但是对于平方根我找不到任何东西。

1
在动态图上维护连接的组件信息的最有效的算法和数据结构是什么?
假设我有一个无向的有限稀疏图,并且需要能够有效地运行以下查询: 一世小号çø Ñ Ñ Ê Ç 吨ë d(N1个,N2)IsConnected(N1,N2)IsConnected(N_1, N_2) - 如果在和之间存在路径,则返回,否则返回N 1 N 2 FŤTTñ1个N1N_1ñ2N2N_2FFF Cø Ñ Ñ Ê Ç 吨ë dñØ dÈ 小号(Ñ)ConnectedNodes(N)ConnectedNodes(N) -返回从可访问的节点集ñNN 通过预先计算图形的连接组件,可以轻松完成此操作。这两个查询都可以在时间中运行。O (1 )O(1)O(1) 如果还需要能够任意添加边 -那么我可以将组件存储在不相交的数据结构中。每当添加一条边时,如果它连接了不同组件中的两个节点,我将合并这些组件。这会将成本增加到,将成本增加到和(也可能是)。一ddËdGÈ (Ñ1个,N2)AddEdge(N1,N2)AddEdge(N_1, N_2)甲d d é d 克ë ø (我Ñ v Ë ř 小号Ë 甲Ç ķ é ř 米一个Ñ Ñ (| Ñ …

1
问题的名字是什么?(将图形划分为三个封面)
我想知道这个问题是否有名字: 给定一个简单的图,其边缘被着色为红色,蓝色和绿色,,是否存在一个顶点着色使得每个边缘都有一个具有相同颜色的端点?Ç :V → { 乙,- [R ,G ^ }G=(V,B∪R∪G)G=(V,B∪R∪G)G=(V,B\cup R\cup G)c:V→{B,R,G}c:V→{B,R,G}c:V\to \{B,R,G\} 此外,这是否已知是NP完全的? 这也可以看作是CSP的一种特例(或2SAT的概括),其中每个约束是2个变量的析取,可以采用三个值之一,并且同一变量对上没有两个约束。

1
给定n个字符串,其中一个是另一个的子字符串吗?
假设我们得到了字符串的集合。我想知道这些字符串中的任何一个是否是集合中任何其他字符串的子字符串。换句话说,我想要一种用于以下任务的算法:ññn小号1个,… ,Sñ小号1个,…,小号ñS_1,\dots,S_n 输入:小号1个,… ,Sñ小号1个,…,小号ñS_1,\dots,S_n 输出:使得是和的子字符串,或者如果不存在这样的则为None我,Ĵ一世,Ĵi,j小号一世小号一世S_i小号Ĵ小号ĴS_ji ≠ j一世≠Ĵi\ne j我,Ĵ一世,Ĵi,j 是否有一种有效的算法? 如果将“子字符串”替换为“前缀”,则存在一种有效的算法(对字符串进行排序,然后进行线性扫描以比较相邻的字符串;排序将确保子字符串相邻)。但是测试任何字符串是否为其他字符串的子字符串似乎更具挑战性。一个朴素的算法是遍历所有对,但这需要子字符串测试。有没有更有效的算法?我,Ĵ一世,Ĵi,jΘ (n2)Θ(ñ2)\Theta(n^2) 我猜我们可以称其为“所有对子字符串测试”或类似的名称。 我的最终目标是修剪集合,以便通过删除集合中其他子字符串的每个子字符串,使任何字符串都不是其他子字符串。

1
有效地找到一组自然数的最大成对GCD
考虑以下问题: 令是自然数的有限子集。S={s1,s2,...sn}S={s1,s2,...sn}S = \{ s_1, s_2, ... s_n \} 令 | 其中是和最大公约数G={G={G = \{ gcd(si,sj)gcd(si,sj)gcd(s_i, s_j)si,sj∈S,si,sj∈S,s_i, s_j \in S, si≠sj}si≠sj} s_i \neq s_j \}gcd(x,y)gcd(x,y)gcd(x,y)xxxyyy 找到的最大元素。GGG 这个问题可以通过使用Euclid算法获取每对最大公约数并跟踪最大对数来解决。 有更有效的解决方法吗?

1
存在什么算法可以求解自然数线性系统?
我在看以下问题: 给定自然数维向量和一些输入向量,是与自然数系数的线性组合吗?v 1,… ,v m u u v iñnnv1个,… ,v米v1,…,vmv_1, \ldots, v_müuuüuuv一世viv_i 即是否有一些,其中? Ù = 吨1 v 1 + ⋯ + 吨米v 米Ť1个,… ,t米∈ ñt1,…,tm∈Nt_1, \ldots, t_m \in \mathbb{N}u = t1个v1个+ ⋯ + t米v米u=t1v1+⋯+tmvmu = t_1 v_1 + \dots + t_m v_m 显然,此问题的实数版本可以使用高斯消除法解决。我想知道,是否已研究此问题的整数版本?有什么算法可以解决呢? 请注意,这是使用自然数,而不是模数,因此这与中国余数定理和类似系统有些不同。另外,它似乎与Diophantine方程有关,但是我想知道在只考虑非负整数的情况下该怎么做?这也使人联想到多维子集和问题,可以使我们对每个向量进行任意数量的复制。似乎还与测试是否是生成的晶格的元素有关,除了这里我们只允许使用非负系数的线性组合。üuuv1个,… ,v米v1个,…,v米v_1,\dots,v_m 对于任何感兴趣的人,这都是通过查看Parikh向量是否在线性集中来实现的,就像Parikh定理一样。 特别是,我对一种可以仅使用自然数运算来解决问题的算法感兴趣,而不必使用实数/浮点数。

1
为什么内省型使用堆排序而不是合并排序?
作为涉及内省排序实现的家庭作业的一部分,我被问到为什么使用堆排序而不是合并排序(或其他算法)。 Ø (ñ 日志(n ))Ø(ñ日志⁡(ñ))O(n\log(n)) Introsort是一种混合排序算法,可提供快速平均性能和(渐近)最佳最坏情况性能。它从快速排序开始,并在递归深度超过基于排序元素数量(的对数)的级别时切换到堆排序。(Wikipedia,检索2014年5月6日。) 我能想到的唯一原因是,heapsort是“就位”的……但是,我并不真正理解为什么这在这里很重要。

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.