【发布时间】:2019-01-20 14:45:46
【问题描述】:
给定数组(比如行向量)A 和 B,我如何找到一个数组 C,使得合并 B 和 C 会得到 A?
例如,给定
A = [2, 4, 6, 4, 3, 3, 1, 5, 5, 5];
B = [2, 3, 5, 5];
然后
C = multiset_diff(A, B) % Should be [4, 6, 4, 3, 1, 5]
(结果的顺序在这里无关紧要)。
对于同一个A,如果B = [2, 4, 5],那么结果应该是[6, 4, 3, 3, 1, 5, 5]。
(由于 A 中有两个 4s 和 B 中有一个 4,因此结果 C 中应该有 2 - 1 = 1 4。对于其他值也是如此。)
PS:请注意,setdiff 将删除所有 2、3 和 5 的实例,而在这里,无论它们在 B 中出现多少次,它们都需要被删除。
性能:我在本地运行了一些 quick-n-dirty 基准测试,以下是结果供将来参考:
-
@heigele 的嵌套循环方法在 A 的小长度(比如最多 N = 50 个左右的元素)中表现最佳。与下一个最佳方法相比,它对小型 (N=20)
李>As 的效果提高了 3 倍,对中型 (N=50)As 的效果提高了 1.5 倍—— @obchardon 的基于
histc的方法。当 A 的大小 N 开始为 100 及以上时,这是表现最好的。例如,当 N = 200 时,这比上述嵌套循环方法好 3 倍。
@matt 的 for+find 方法与小 N 的 histc 方法相当,但对于较大的 N,性能会迅速下降(这是有道理的,因为每次迭代都会运行整个 C == B(x) 比较)。
(在撰写本文时,其他方法要么慢几倍,要么无效。)
【问题讨论】:
-
合并是什么意思?如何将 [2,3,5,5] 与 [4,6,4,3,1,5] 合并得到 [2,4,6,4,3,3,1,5,5,5] ?你只想要任何随机顺序的相同数值吗?这样
D = cat(2,B,C)? -
@Matt “任何随机顺序的相同数值” 差不多,是的。这里的“合并”是概念性的,而不是特定的算法过程,旨在说明预期结果会是什么样子。使用
D = cat(2, B, C),那么 D 应该是 A 的排列。 -
有趣的结果!是时候将马特的答案标记为已接受了:)