高效的 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-1
,B=n, 2*n, 3*n, ...n*n
),那么如果我们依赖n
和m
,我们就没有希望了找到一个二次算法。
一个简单的方法是计算所有对(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 otherwise
和B
类似。每个这样的向量的大小为M
。
使用 FFT 计算 A
和 B
的卷积(时间:O(M log M)
)。输出大小为 O(M
)。
O
- 在每个单元格处,O[i]
非零,如果 i
是 Minkowski 和的一个元素。
证明:O[i] != 0
当且仅当存在k
使得A[k] != 0
和B[i-k] != 0
,当且当k \in A
和i-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 和计算的主要内容,如果未能解决你的问题,请参考以下文章