Questions tagged «algorithms»

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

5
如何找到最大集合元素的
我有一个算法问题。 TŤTnñnSSSTTTa∈Sa∈Sa\in Sa⩾|S|a⩾|S|a\geqslant |S| 例如: 如果 = [1、3、4、1、3、6],则可以为[3、3、6]或[3、4、6]或[4、3、6]。TTTSSS 在 = [7,5,1,1,7,4]中,则为[7,5,7,4]。小号TTTSSS 我已经尝试过此递归函数。 function(T): if minimum(T) >= length(T): return T else: return function(T\minimum(T)) 是否有任何非递归算法。(我没有检查我的递归算法,所以它可能有一些缺陷。)

2
二进制搜索和插值搜索相结合背后是否有任何研究或理论?
我刚刚读过该算法是否仍可以视为二进制搜索算法?并回顾了几年前,我写了一个索引器/搜索日志文件,以按日期/时间窗口在大型纯文本文件中查找日志条目。 在这样做的同时,我决定尝试插值搜索(我不知道那是什么,我自己偶然发现了这个想法)。然后出于某种原因,我继续采用交替插值步骤与二进制拆分步骤的想法:在步骤0上,我将进行插值以确定测试点,然后在步骤1上,我将采用精确的中点等。 然后,我使用纯插值搜索,纯二进制搜索和组合尝试对系统进行了基准测试。在找到一组随机选择的时间之前,在时间和所需测试数量上,交替方法无疑是赢家。 受链接问题的启发,我只是快速搜索了“交替插值搜索和二进制搜索”,却一无所获。我还尝试了“对冲插值搜索”,如对某个答案的评论所建议的那样。 我偶然发现了一个已知的东西吗?对于某些类型的数据,它有更快的速度吗?日志文件通常在时间上很大(例如1-2 GB的文本,可能要搜索1000万行),并且日期/时间在其中的分布非常复杂,包括大量的活动,一般的高峰时间和安静时间。我的基准测试是从均匀分布的目标时间中采样得出的。

1
组合式ILP算法最快的已知复杂度?
我想知道,就Big- 表示法而言,什么是最著名的算法来解决整数线性规划?OOO 我知道问题是,所以我不期望任何多项式。而且我知道有很多启发式算法,它们都用于CPLEX等实际应用中,但是我对精确算法的形式化,最坏情况下的复杂性更感兴趣。NPNPNP 一些问题具有时间算法,其中并且是多项式。顶点覆盖,独立集合和3SAT属于此类,但通用SAT和TSP则不(据我们所知)。NPNPNPO(bnp(n))O(bnp(n))O(b^n p(n))1&lt;b&lt;21&lt;b&lt;21 < b < 2ppp 是否可以对整数编程或特定子实例发表任何此类声明? 如果有人对免费量化器Presburger算术的相关问题有参考,我也会对此非常感兴趣。

6
在一个间隔中找到两个数字的最大异或:我们能做得比二次更好吗?
lllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r 天真的算法只检查所有可能的对。例如在红宝石中,我们有: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j &gt; max) max = i ^ j end end end max end 我感觉到,我们可以做得比二次。是否有针对此问题的更好算法?

4
排序算法是否需要传递性
是否可以将排序算法与非传递性比较一起使用?如果是,为什么将传递性列为排序比较器的要求? 背景: 排序算法通常根据比较器函数C(x,y)对列表的元素进行排序,其中 C(x,y)=⎧⎩⎨−10+1if x≺yif x∼yif x≻yC(x,y)={−1if x≺y0if x∼y+1if x≻y\begin{array}{ll} C(x,y) = \begin{cases} -1 & {\text{if}}\ x\prec y \\ 0 & {\text{if}}\ x\sim y \\ +1 & {\text{if}}\ x\succ y \\ \end{cases} \end{array} 据我了解,此比较器的要求是: 自反: ∀x:C(x,x)=0∀x:C(x,x)=0\forall x: C(x,x)=0 反对称: ∀x,y:C(x,y)=−C(y,x)∀x,y:C(x,y)=−C(y,x)\forall x,y: C(x,y) = - C(y,x) 传递性: ∀x,y,z,a:C(x,y)=a∧C(y,z)=a⇒C(x,z)=a∀x,y,z,a:C(x,y)=a∧C(y,z)=a⇒C(x,z)=a\forall x,y,z, a: C(x,y)=a …

3
小猫领养问题的复杂性
这是在我尝试回答有关最小化接线长度的问题时提出的 。我本来将其称为“一夫多妻制婚姻”问题,但互联网却是如此。好极了! 假设我们有需要由采用小猫ñ人,中号&gt; ñ。对于每只小猫,我和每个人j都有一个成本c i j。我们希望将收养所有小猫的总成本降到最低。还有一组约束条件:每个人j的收养能力不超过uMMMNNNM&gt;NM&gt;NM > Niiijjjcijcijc_{ij}jjj小猫。ujuju_j 没有约束,问题就很容易解决。每个小猫去与人Ĵ为其Ç 我Ĵ是最小的。有了这些约束,是否有一个针对该问题的有效算法?iiijjjcijcijc_{ij}

4
计算两个大集合之间的集合差
我有两个大的整数集的AAA和BBB。每组有大约一百万个条目,每个条目是一个正整数,最长为10位数字。 计算A∖BA∖BA\setminus B和的最佳算法是什么B∖AB∖AB\setminus A?换句话说,如何有效地计算不在B中的条目列表,反之亦然?代表这两组数据,使这些操作高效的最佳数据结构是什么?AAABBB 我能想到的最好方法是将这两个集合存储为排序列表,并以线性方式将AAA每个元素与每个元素进行比较BBB。我们可以做得更好吗?

2
嵌入欧氏平面(2D)的图形的最短非相交路径
您将使用哪种算法来找到图的最短路径,该最短路径被嵌入到欧几里德平面中,因此该路径不应包含任何自相交(在嵌入中)? 例如,在下面的图表中,你想从去。通常,像Dijkstra算法那样的算法会产生如下序列:(0 ,0 )→ (- 3 ,2 )(0,0)→(-3,2)(0,0) \rightarrow (-3,2) [(0 ,0 )→3(0 ,3 )→2√(1 ,2 )→4(- 3 ,2 )] = 7 + 2–√。[(0,0)→3(0,3)→2(1个,2)→4(-3,2)]=7+2。\left[ (0,0) \stackrel {3}{\rightarrow} (0,3) \stackrel{\sqrt{2}}{\rightarrow} (1,2) \stackrel{4}{\rightarrow} (-3,2) \right] = 7+\sqrt{2}. 完整图: 最短的路径: 最短的非相交路径: 但是,此路径在欧几里得平面上相交,因此我需要一种算法,该算法可以为我提供最短的非相交序列,在这种情况下: [(0 ,0 )→3(0 ,3 )→3(0 ,6 )→5(- 3 ,2 )] = …

1
成对和的无FFT
假设我们给了nnn不同的整数,使得a1,a2,…,ana1,a2,…,ana_1, a_2, \dots, a_n0≤ai≤kn0≤ai≤kn0 \le a_i \le kn对于某一常数k&gt;0k&gt;0k \gt 0,和对于所有iii。 我们对找到所有可能的成对和的计数感兴趣。(允许i = j)。Sij=ai+ajSij=ai+ajS_{ij} = a_i + a_ji=ji=ji = j 一种算法是构造多项式度≤ ķ Ñ,并使用傅里叶变换方法和在所得的多项式读出与它们的系数的权力计算其平方。这是O (n log n )时间算法。P(x)=∑nj=1xajP(x)=∑j=1nxajP(x) = \sum_{j=1}^{n} x^{a_j}≤kn≤kn\le knO(nlogn)O(nlog⁡n)O(n \log n) 我有两个问题: 是否有不使用FFT 的算法?O(nlogn)O(nlog⁡n)O(n \log n) 是否知道更好的算法(即)?(允许FFT)。o(nlogn)o(nlog⁡n)o(n \log n)

1
检索有向无环图的传递闭合的高效算法
我正在尝试解决图形问题(这不是为了做作业,只是为了练习我的技能)。给出了DAG ,其中V是顶点集合,E是边线。该图被表示为邻接表,所以甲v是包含的所有连接的一组v。我的任务是找到它的顶点是从每个顶点可达v ∈ V。我使用的解决方案的复杂度为 O (V 3)G(V,E)G(V,E)G(V,E)VVVEEEAvAvA_vvvvv∈Vv∈Vv\in VO(V3)O(V3)O(V^3),带有传递闭包,但是我在博客中读到它可以更快,尽管它没有揭示如何实现。谁能告诉我另一种方法(具有更好的复杂性)来解决DAG中的传递闭包问题?

2
Bellman-Ford算法-为什么无法按顺序更新边缘?
的Bellman-Ford算法确定从源的最短路径到所有其它顶点。最初,与所有其他顶点之间距离设置为。然后计算从到每个顶点的最短路径;这正好为 迭代。我的问题是:小号∞ 小号| V | − 1ssssss∞∞\inftysss|V|−1|V|−1|V|-1 为什么需要迭代?|V|−1|V|−1|V|-1 如果以其他顺序检查边缘会不会很重要? 假设,如果我先检查边缘1,2,3,然后在第二次迭代中检查2,3,1。 麻省理工学院的埃里克教授说顺序并不重要,但是这使我感到困惑:如果算法的值取决于边缘但是是在之后更新的,该算法是否会错误地基于边缘更新节点?x2x2x_2x1x1x_1x1x1x_1x2x2x_2

2
设置相似度-计算Jaccard索引而没有二次复杂度
我有一组n个集合,需要为它们计算一种“唯一性”或“相似性”值。我已经将Jaccard索引确定为合适的指标。不幸的是,Jaccard索引一次只能操作两组。为了计算所有集合之间的相似度,将需要按n 2个 Jaccard计算的顺序。ññnñ2ñ2n^2 (如果有帮助,通常在10到10000之间,并且每个集合平均包含500个元素。而且,最后,我不在乎任何两个特定的集合有多相似-而是,我只在乎内部相似度是多少整个集合集的总和是(换句话说,该组中所有Jaccard索引的均值(或均值的至少足够准确的近似值))ññn 两个问题: 有没有办法在没有复杂度的情况下仍然使用Jaccard索引?ñ2ñ2n^2 有没有比我上面建议的方法更好的方法来计算一组集合之间的集合相似性/唯一性?

2
随机算法分类
来自维基百科,关于随机算法 一个具有区分算法使用随机输入减少的预期运行时间或内存使用情况,但总是有一个正确的结果在有限时间终止,并且 概率算法其中,根据不同的随机输入,有机会产生错误结果(蒙特卡罗算法)或通过发出失败或失败终止信号未能产生结果(拉斯维加斯算法)的结果。 我想知道第一种“ 算法 ”如何使用随机输入来减少预期的运行时间或内存使用率,但是总是在有限的时间内以正确的结果终止? 它和可能无法产生结果的拉斯维加斯算法之间有什么区别? 如果我理解正确,则概率算法和随机算法不是同一概念。概率算法只是一种随机算法,另一种是那些使用随机输入来减少预期的运行时间或内存使用量,但总是在有限的时间内以正确的结果终止的算法?

3
一个高效的数据结构,支持Insert,Delete和MostFrequent
假设我们有一组DDD和的每个成员DDD是数据和密钥对。我们需要一个支持以下操作的数据结构: 将(d,k)(d,k)(d,k)插入DDD, 删除成员eee,(无需搜索以找到eee,例如eee指向的成员DDD), MostFrequent,它返回一个构件e∈De∈De \in D使得e.keye.keye.key是最常用的键之一DDD(请注意,最常用的键不需要唯一)。 什么是该数据结构的有效实现? 我的解决方案是为键及其频率按频率分配优先级的堆,再加上一个哈希表,在哈希表中,哈希函数将具有相同键的成员映射到哈希表中的同一插槽(指针从每个部分指向另一个部分)。 这可以使Θ(lgn)Θ(lg⁡n)\Theta(\lg n)对于前两个操作和Θ(1)Θ(1)\Theta(1)用于第三(最坏情况的运行时间)。 我想知道是否有更有效的解决方案?(或具有相同效率的更简单解决方案?)

1
计算反转对
分而治之的经典应用是解决以下问题: 给定不同的可比较元素的数组,计算数组中的反转对的数量:对,使得和。a[1…n]a[1…n]a[1\dots n](i,j)(i,j)(i,j)a[i]&gt;a[j]a[i]&gt;a[j]a[i] \gt a[j]i&lt;ji&lt;ji \lt j 一种解决方法是进行合并排序,但还要计算子问题中反转对的数量。在合并步骤中,我们计算跨越(两个)子问题的反转对的数量,并将其添加到子问题的计数中。 虽然这很好,并且给出了时间算法,但是却弄乱了数组。O(nlogn)O(nlog⁡n)O(n\log n) 如果我们还有其他限制,即数组是只读的,则可以制作一个副本并处理该副本,或者使用其他数据结构(例如订单统计平衡二叉树)进行计数,两者都使用空间。Θ(n)Θ(n)\Theta(n) 当前的问题是在不影响运行时间的情况下尝试改善空间。即 是否存在时间算法来计算反转对的数量,该算法适用于只读数组并使用亚线性(即)空间?O(nlogn)O(nlog⁡n)O(n\log n)o(n)o(n)o(n) 假设一个成本均一的RAM模型,并且元素占用空间,并且它们之间的比较为。O(1)O(1)O(1)O(1)O(1)O(1) 参考会做,但是一个解释会更好:-) 我尝试在网上搜索,但找不到任何肯定/否定答案。我想这只是出于好奇。

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.