设置覆盖:查找与目标数组

时间:2017-10-18 14:12:05

标签: javascript arrays algorithm

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

我有一组数组BCD等等...(所有可排序的),所有数组都可能部分或完全重叠数组{{1} }。

我想找到完全重叠数组A的最小数组BCD等等。返回第一场比赛。

例如

A

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

2 个答案:

答案 0 :(得分:1)

这被称为“Set Cover”问题。它是NP完全的,并且经过充分研究。 “正确答案”取决于输入的大小以及是否可以使用近似值。

答案 1 :(得分:0)

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

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']

function findSmallestSet(one, [B, C, D, E]) {
  let obj = {B, C, D, E}
  let keys = Object.keys(obj);
  let getL = (e) => obj[e].filter(e => one.includes(e)).length
  let sortK = (keys) => keys.sort((a, b) => getL(b) - getL(a))
  sortK(keys)
  var r = []

  let find = (one, k) => {
    obj[k[0]].forEach(function(a) {
      var index = one.indexOf(a);
      if (index != -1) one.splice(index, 1)
    })
    
    r.push(k[0])

    if (one.length) {
      k.shift()
      sortK(k)
      find(one, k)
    }
  }

  find(one, keys)
  return r;
}

console.log(findSmallestSet(A, [B, C, D, E]));