Javascript 集合覆盖:查找与目标数组元素重叠的数组集合

Javascript 集合覆盖:查找与目标数组元素重叠的数组集合,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,假设我有一个数组,A(可排序,如果有帮助的话) 我有一组数组,B,C,D,等等。。。(所有可排序),所有这些都可能部分或完全重叠数组A 我想找到最小的数组集B,C,D,等等。。。完全重叠的数组A。返回第一个匹配项 例如 旁白:我最初的问题是寻找与目标节点树完全重叠的节点树,但我认为上面提出的问题可能是一个更简单的解决方案。您可以这样做,首先创建排序函数,该函数将根据匹配元素的数量对第二个参数进行排序,以便从那里开始,然后,循环每个内部数组,并从第一个参数中删除元素(如果它在当前数组中找到它),如

假设我有一个数组,
A
(可排序,如果有帮助的话)

我有一组数组,
B
C
D
,等等。。。(所有可排序),所有这些都可能部分或完全重叠数组
A

我想找到最小的数组集
B
C
D
,等等。。。完全重叠的数组
A
。返回第一个匹配项

例如


旁白:我最初的问题是寻找与目标节点树完全重叠的节点树,但我认为上面提出的问题可能是一个更简单的解决方案。

您可以这样做,首先创建排序函数,该函数将根据匹配元素的数量对第二个参数进行排序,以便从那里开始,然后,循环每个内部数组,并从第一个参数中删除元素(如果它在当前数组中找到它),如果第一个数组中有剩余元素,则再次对键进行排序,并使用递归重复该过程

const A=[1,2,3,4',A',b',c'];
常数B=[1,3,4,5,10];
常数C=[1,3,5,'a','b']
常数D=[2,4,'a','b','c'];
常数E=[1,2,'b','c']
函数findSalestSet(一个[B,C,D,E]){
设obj={B,C,D,E}
设keys=Object.keys(obj);
让getL=(e)=>obj[e].filter(e=>one.includes(e)).length
让sortK=(keys)=>keys.sort((a,b)=>getL(b)-getL(a))
sortK(钥匙)
var r=[]
让find=(一,k)=>{
obj[k[0].forEach(函数(a){
var指数=1.indexOf(a);
如果(索引!=-1)一个拼接(索引,1)
})
r、 推送(k[0])
如果(一个长度){
k、 移位()
sortK(k)
查找(一,k)
}
}
找到(一把钥匙)
返回r;
}

log(findsmalestset(A[B,C,D,E])这就是所谓的“设置封面”问题。它是NP完全的,并且经过了很好的研究。“正确答案”取决于输入的大小以及您是否能接受近似值。

最小数组数B C D E或最小组合元素数B C D E?最小数组数。感谢您澄清问题:)我喜欢此解决方案的优雅,但我认为它在以下情况下失败:
const B=[1,4,5,10,'c'];常数C=[3,2,'a','b'];常数D=[2,4,'a','b','c'];常数E=[5,6,'d','E']谢谢你给我介绍了封面问题。是否有任何限制可以大大简化问题?假设集合的数量在10-100之间
const A = [1, 2, 3, 4, 'a', 'b', 'c'];

const B = [1, 3, 4, 5, 10];
const C = [1, 3, 5, 'a', 'b']
const D = [2, 4, 'a', 'b', 'c'];
const E = [1, 2, 'b', 'c'] 

findSmallestSet(A, [B, C, D, E]);
// => [B, D]