我有一组节点,每个节点包含0个或更多点。节点之间存在重复点,但每个节点可能包含该节点唯一的点。
例如:
等
是否有算法或方法可以找到包含最多点数的最少数量的节点,达到特定限制?
在上面的例子中,如果我需要4个唯一的点,我会得到节点A和节点C,或节点A和节点D.
目前,我通过按点数(如节点A,节点C,节点D)降序排序节点列表并丢弃没有点的节点(节点B)来解决这个问题。然后,我在节点列表上进行迭代,计算唯一点(并记录所查看的节点),直到达到定义的唯一点阈值。因此,在上面的示例中,我的结果将是节点A和节点C.
对于它的价值,我在Javascript中这样做,但我认为我的问题更多的是“如何解决问题”而与特定语言无关。如果这是不正确的发布地点,请道歉。
答案 0 :(得分:1)
从我所看到的,没有限制,Set Cover减少你的问题应该是微不足道的。未指定您的限制,因此它也可以跨越所有可能的点。因此,蛮力是唯一可行的选择。请注意,即使进一步指定限制,我仍然认为它是NP完全的。
排序不应该这样做:排序后的前n个节点可能有许多重复点,使得“更好”包含每个点数较少的节点。
答案 1 :(得分:0)
您可以构建所有可能的组合并对值求和,过滤目标值并将结果集排序为所需的约束。
取结果上面的项目。
var array = [3, 0, 2, 1],
i,
result = [],
values,
sum;
// filter zero values
array = array.filter(function (a) {
return a;
});
// generate all possible combination and build sum
for (i = 0; i < 1 << array.length; i++) {
sum = 0;
values = array.filter(function (a, j) {
if (i & (1 << j)) {
sum += a;
return true;
}
});
// add only relevant items to the result set
sum >= 4 && result.push({ values: values, sum: sum });
}
// sort by priority
result.sort(function (a, b) {
return a.values.length - b.values.length || a.sum - b.sum;
});
console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;