Javascript 找到4个百分比之间的所有可能性
我想找到一种方法,将四个百分比之间的所有可能性合并成一个数组 所需结果:Javascript 找到4个百分比之间的所有可能性,javascript,arrays,algorithm,performance,Javascript,Arrays,Algorithm,Performance,我想找到一种方法,将四个百分比之间的所有可能性合并成一个数组 所需结果: possibilities = [[100,0,0,0],[99,1,0,0],[99,0,1,0],...,[0,0,1,99],[0,0,0,100]] 我正在使用这个函数,但它的速度非常慢,似乎并没有产生所有的可能性 combinePossibilities : function(a, min, max) { var deferred = $q.defer(); function toObject(
possibilities = [[100,0,0,0],[99,1,0,0],[99,0,1,0],...,[0,0,1,99],[0,0,0,100]]
我正在使用这个函数,但它的速度非常慢,似乎并没有产生所有的可能性
combinePossibilities : function(a, min, max) {
var deferred = $q.defer();
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i){
rv['fund'+i] = arr[i];
}
return rv;
}
var fn = function(n, src, got, all) {
if (n === 0) {
if (got.length > 0) {
var total = 0;
angular.forEach(got, function(value){
total += value; //GET TOTAL OF THE COMBINATION
});
if(total === 100){
all.push(toObject(got));
}
}
return;
}
for (var j = 0; j < src.length; j++) {
fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all);
}
return;
};
var all = [];
for (var i = min; i <= max; i++) {
console.log(a);
fn(i, a, [], all);
}
deferred.resolve(all);
return deferred.promise;
}
组合可能性:函数(a、最小值、最大值){
var deferred=$q.deferred();
函数对象(arr){
var rv={};
对于(变量i=0;i0){
var合计=0;
角度。forEach(got,函数(值){
total+=value;//获取组合的总计
});
如果(总数===100){
全部。推(toObject(got));
}
}
返回;
}
对于(var j=0;j 对于(var i=min;i这个建议是一个函数递归函数,它取和和和长度。它返回一个数组,数组中包含从和到零的组合值
function combine(sum, length, part) {
var result = [],
i = sum;
part = part || [];
if (length === 1) {
return [part.concat(sum)];
}
if (length === 0) {
return [part];
}
do {
result = result.concat(combine(sum - i, length - 1, part.concat(i)));
} while (i--);
return result;
}
工作原理:
length: 21
[
[5, 0, 0],
[4, 1, 0],
[4, 0, 1],
[3, 2, 0],
[3, 1, 1],
[3, 0, 2],
[2, 3, 0],
[2, 2, 1],
[2, 1, 2],
[2, 0, 3],
[1, 4, 0],
[1, 3, 1],
[1, 2, 2],
[1, 1, 3],
[1, 0, 4],
[0, 5, 0],
[0, 4, 1],
[0, 3, 2],
[0, 2, 3],
[0, 1, 4],
[0, 0, 5]
]
它以给定的sum
和length
和一个空的结果
集开始,以及一个值为sum
的迭代器变量i
如果未给出部分
,则分配一个空数组
下面是对(剩余的)长度的一些检查以及它们的特殊处理(如果是)
1
:这是最后一次迭代,只剩下sum
。然后返回数组中由sum
连接的部分结果part
0
:不再迭代,然后返回数组中的部分结果part
如果长度
既不是1
也不是0
,则对和
进行迭代,使其为零
combine
的调用将减少的sum
、减少的length
和部分结果part
的值取为i
调用combine()
的结果连接到结果集
组合(5,3)
的示例:
length: 21
[
[5, 0, 0],
[4, 1, 0],
[4, 0, 1],
[3, 2, 0],
[3, 1, 1],
[3, 0, 2],
[2, 3, 0],
[2, 2, 1],
[2, 1, 2],
[2, 0, 3],
[1, 4, 0],
[1, 3, 1],
[1, 2, 2],
[1, 1, 3],
[1, 0, 4],
[0, 5, 0],
[0, 4, 1],
[0, 3, 2],
[0, 2, 3],
[0, 1, 4],
[0, 0, 5]
]
有两个示例的工作代码:
length: 21
[
[5, 0, 0],
[4, 1, 0],
[4, 0, 1],
[3, 2, 0],
[3, 1, 1],
[3, 0, 2],
[2, 3, 0],
[2, 2, 1],
[2, 1, 2],
[2, 0, 3],
[1, 4, 0],
[1, 3, 1],
[1, 2, 2],
[1, 1, 3],
[1, 0, 4],
[0, 5, 0],
[0, 4, 1],
[0, 3, 2],
[0, 2, 3],
[0, 1, 4],
[0, 0, 5]
]
联合收割机(5,3)
联合收割机(10,4)
函数组合(总和、长度、部分){
var结果=[],
i=总和;
零件=零件| |[];
如果(长度==1){
收益[部分收益(总和)];
}
如果(长度==0){
返回[部分];
}
做{
result=result.concat(合并(总和-i,长度-1,部分-concat(i));
}而(我--),;
返回结果;
}
函数打印(数组){
document.write('length:'+array.length+'\n'+JSON.stringify(array,0,4)+'');
}
打印(合并(5,3));
打印(组合(10,4));
你所说的所有可能性是什么意思?比如[0,0,0,0]
到[0,0,0,100]
到[0,0,1,0]
最后到[100,100,100]
?更清楚地定义你的问题。什么是输入,什么是预期的输出?@MattBurland,我想要一个数组,所有可能值都等于100。结果=[[100,0,0,0],[99,1,0,0],…,[95,2,1,2],…,[25,25,25,25],[0,0,0100]。希望我足够清楚。var anArray={ofArray{“所有可能性”:100}好了,所有可能性都等于100的数组为什么有这么多数组?你想要4个整数的所有排列,总和为100?这正是我需要的。非常感谢@NinaScholz!176850个可能性,太多了。