arrays - 查找(多集)两个数组之间的差异
问题描述
给定数组(比如行向量)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 中有两个4
s,4
B 中有一个,因此结果 C 中应该有 2 - 1 = 1。4
对于其他值也是如此。)
PS:请注意,这setdiff
将删除 2、3 和 5 的所有实例,而在这里它们需要被删除,无论它们在 B 中出现多少次。
性能:我在本地运行了一些 quick-n-dirty 基准测试,以下是供将来参考的结果:
@heigele 的嵌套循环方法对于 A 的小长度(比如最多 N = 50 个左右的元素)表现最好。与下一个最佳方法相比,它对小型 (N=20)
A
的性能提高 3 倍,对中型 (N=50) 提高 1.5 倍,即:A
@obchardon 的
histc
基于方法。当 A 的大小 N 开始为 100 及以上时,这是表现最好的。例如,当 N = 200 时,这比上述嵌套循环方法好 3 倍。
@matt 的 for+find 方法与小 N 的 histc 方法相当,但对于较大的 N,性能会迅速下降(这是有道理的,因为C == B(x)
每次迭代都会运行整个比较)。
(在撰写本文时,其他方法要么慢几倍,要么无效。)
解决方案
我不喜欢循环,但对于随机扰动,A
这是我想出的最好的方法。
C = A;
for x = 1:numel(B)
C(find(C == B(x), 1, 'first')) = [];
end
我很好奇查看不同顺序A
对解决方案方法的影响,所以我设置了一个这样的测试:
Ctruth = [1 3 3 4 5 5 6];
for testNumber = 1:100
Atest = A(randperm(numel(A)));
C = myFunction(Atest,B);
C = sort(C);
assert(all(C==Ctruth));
end
推荐阅读
- node.js - 节点 js 将 mp4 转换为 m3u8 后,第一个 m3u8 ts 段不起作用
- mysql - 无法从数据库中获取建议的身份策略列表。可能是 JDBC 驱动程序问题
- javascript - 在使用 javascript no jquery 填写表单(所有输入)后启用提交 btn
- python - QListWidgetItem 中未显示图标
- azure - 在 powershell 或 azcli 中操作 az cli 命令的输出返回
- java - Selenium Intellij 没有运行 Testng 的测试
- mysql - 通过 q 和 user_id 从 MySql 组中选择搜索最多的关键字
- javascript - 这是计算字符串的最佳方法吗
- mongodb - MongoDB & Parse Server - 无法基于 geoPoint 进行查询
- python - 导入 pyaudio 不起作用 - 找不到符号:mac 上的 _PaMacCore_SetupChannelMap(Big Sur M1 Apple Silicon)