高效的 Minkowski 和计算

Posted

技术标签:

【中文标题】高效的 Minkowski 和计算【英文标题】:Efficient Minkowski sum calculation 【发布时间】:2012-07-13 18:16:57 【问题描述】:

不知道有没有算法可以高效计算 离散的一维 Minkowski 和。闵可夫斯基和定义为:

S + T =  x + y | x in S, y in T 

我们是否可以将集合表示为列表,对 S 和 T 进行排序,然后 然后做一些类似于计算两个集合的并集的事情。即步行 沿着集合并行生成结果。

有没有这样的算法,我不需要额外排序 删除重叠案例 x1+y1 = x2+y2 的结果?最好用 Java 编写?

【问题讨论】:

如果有一种算法明显优于二次时间,我会感到非常惊讶。 我在我大学的 repos 中的一个文档中找到了这个。也许这会有所帮助:iwi138.iwinet.rug.nl/informatica/users/bekker/publications/… @Lopina 这是一个死链接。 j4n bur53 为什么你没有接受答案,你还在等吗? @gsamaras 在 user1071136 的回答中查看我的评论,我仍在等待改进的版本。但无论如何,请随意投票。我已经用完了所有的选票。 我已经对你和他投了赞成票@j4nbur53,很确定你不会得到改进的版本。 :) 【参考方案1】:

首先,输出的大小可以是O(nm),如果没有冲突(例如,A=0, 1, 2, ..., n-1B=n, 2*n, 3*n, ...n*n),那么如果我们依赖nm,我们就没有希望了找到一个二次算法。 一个简单的方法是计算所有对(O(nm))、排序和唯一性(O(nm log nm) 的总数。

如果您有一个上限M,使得x <= M 对应于A union B 中的所有x,我们可以通过以下方式计算O(M log M) 中的总和。

    生成特征向量A[i] = 1 ff i \in A, 0 otherwiseB 类似。每个这样的向量的大小为M

    使用 FFT 计算 AB 的卷积(时间:O(M log M))。输出大小为 O(M)。

    扫描输出 O - 在每个单元格处,O[i] 非零,如果 i 是 Minkowski 和的一个元素。

证明:O[i] != 0 当且仅当存在k 使得A[k] != 0B[i-k] != 0,当且当k \in Ai-k \in B,当且当k + i-k,即i,在闵可夫斯基和中。

(取自this paper)

【讨论】:

如果 0 = 【参考方案2】:

对 S 和 T 进行排序,遍历 S 并在 T 中搜索匹配的元素,每次找到匹配项时,从 S 和 T 中删除元素并将其放入新的集合 U 中。因为它们是排序的,一旦找到匹配项在 T 中,T 中的进一步比较可以从最后一个匹配开始。

现在 S、T 和 U 都是不相交的。所以迭代 S 和 T 并添加一个,以及 S 和 U,以及 T 和 U。最后迭代 U,并将 U 中的每个元素添加到 U 中的每个元素,其集合索引等于或大于当前集合索引。

遗憾的是,这种优化算法仍然是 O(n^2)。如果 T 和 S 相同,它将比简单解决方案快 2 倍。您也不必在输出集中搜索重复项。

【讨论】:

嗯,对。我的意思是添加。当我输入它时,我正在考虑集合乘法 - 将所有元素组合在一个集合中。 嗯,是的,也不是。我想这取决于添加元素的属性。如果有可能有多种方法可以获得相同的结果,那么它将不起作用 - 您仍然必须搜索输出集。如果只有一种方法可以获得任何结果,那么它会比迭代两组要快一些。你这里真的没有N。你有 N 和 M,T 和 S 的大小。所以它真的是 O( MN + log2N + log2M )。如果您在组合后进行搜索,那么它将是 O(MN + log2(M*N)) 对数乘法,log(m*n) = log m + log n。所以没有区别。我希望可以通过在 S 和 T 上并行迭代来完成一些事情。例如,相应的联合算法是复杂度 O(n+m)。

以上是关于高效的 Minkowski 和计算的主要内容,如果未能解决你的问题,请参考以下文章

3.斐波那契数列的高效方法

高效的 SQL 来计算共享从属关系的数量

计算n个最近节点的大数据网络文件处理的高效算法

快速高效的数组计算

云计算热度不减,如何高效掌握云计算技能?

云计算热度不减,如何高效掌握云计算技能?