【发布时间】:2014-11-08 11:54:59
【问题描述】:
给定一个长度为n 的数组arr,找到arr 中的任何元素,使得它们的和为x 并且它们的平方和最小。我试图找到复杂度最低的算法。到目前为止,我已经编写了一个简单的递归算法,可以找到数组中的所有子集并将总和检查作为基本条件。我写的代码是 javascript 如下:
var arr = [3, 4, 2, 1];
var arr2 = arr.map(function(n) { return n*n; });
var max_sum = 5;
var most_min = -1;
function _rec(i, _sum, _square) {
if(_sum >= max_sum) {
if(most_min == -1 || _square < most_min) {
most_min = _square;
console.log("MIN: " + most_min);
}
console.log("END");
return;
}
if(i >= arr.length)
return;
console.log(i);
var n = arr[i];
// square of above number
var n2 = arr2[i];
_sum = _sum + n;
_square = _square + n2;
_rec(i+1, _sum, _square);
_sum = _sum - n;
_square = _square - n2;
_rec(i+1, _sum, _square);
}
_rec(0, 0, 0);
访问http://jsfiddle.net/1dxgq6d5/6/查看上述算法的输出。上述算法非常简单,它通过在每个递归步骤评估两个选择来找到所有子集; 1) 选择当前数字或 2) 拒绝然后继续递归。
我正在尝试找到一种比上面的简单递归更有效的算法。任何建议或帮助将不胜感激。
另一个假设
我在想,如果我对数组进行排序,并找到具有最小方差(彼此之间的分隔)的元素子集,使得它们的总和为 x 将满足我的要求。不确定这是否会很有帮助,但我目前正在努力改进我目前的盲递归方法。
【问题讨论】:
-
最小方差很有用,使用大量小数字而不是单个更大的数字也是如此:例如,使用 4 和 6 比使用 10 更好。
标签: algorithm recursion data-structures