Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 装箱问题-确定给定范围内一组值的最佳分组_Javascript_Algorithm_Grouping - Fatal编程技术网

Javascript 装箱问题-确定给定范围内一组值的最佳分组

Javascript 装箱问题-确定给定范围内一组值的最佳分组,javascript,algorithm,grouping,Javascript,Algorithm,Grouping,我的问题与我试图根据组合大小(媒体文件)分组和合并的文件有关。一般来说,我有一个程序,可以将多个文件合并成一组合并文件 用户可以选择任意数量的文件供程序合并 程序将合并文件,并输出合并的文件 合并的文件必须在一定的大小范围内。在我的例子中,是2.2gb到4.2gb 假设用户选择了10个文件。 我需要的程序,然后结合在最优化的方式可能的文件。如果最后一个文件是800mb,并且不能与前三个文件合并,但是文件数组可以被重新组织以合并800mb文件,那么我需要程序来这样做 下面是一个抽象程序,说明:

我的问题与我试图根据组合大小(媒体文件)分组和合并的文件有关。一般来说,我有一个程序,可以将多个文件合并成一组合并文件

用户可以选择任意数量的文件供程序合并

程序将合并文件,并输出合并的文件

合并的文件必须在一定的大小范围内。在我的例子中,是2.2gb到4.2gb

假设用户选择了10个文件。 我需要的程序,然后结合在最优化的方式可能的文件。如果最后一个文件是800mb,并且不能与前三个文件合并,但是文件数组可以被重新组织以合并800mb文件,那么我需要程序来这样做

下面是一个抽象程序,说明:

console.log(输出(2.2,4.2,[1.5,4,1.2,2.2,1.1,1.7,1.8,2,8]);
函数输出(下限、上限、值){
设群=[];
//这是可行的,但输出时会挂起.8。
组=[[1,5,4,1.2],[2.2,1.1],[1.7,1.8,2],[1.8];
//通过改变事物,以更优化的方式重组以合并.8。
组=[[1,5,4,1.2],[2.2,1.1,8],[1.7,1.8,2];
返回组;

}
如果我理解得很好,我想你可以这样做: 我希望这就是您想要的,编写代码真的很有趣:)

您可以运行代码段以查看结果

/=============函数定义==========
函数输出(存储、文件存储、最小值、最大值){
for(文件存储的文件){
if(storage.length==0){
let chunk=[]
存储推送(区块)
}
让fileIsStored=false
用于(存储块){
if(hastchunkenoughavailablespace(块、文件、最小值、最大值)){
chunk.push(文件)
fileIsStored=true
}
}
如果(!fileIsStored){
storage.push([文件])
}
}
}
函数hasChunkEnoughAvailableSpace(块、文件大小、最小值、最大值){
让totalSize=chunk.reduce((a,b)=>a+b,0)//这只是一个“和”
return fileSizeMath.floor(Math.random()*60));
//根据我的需要,在你的地方调整一下就行了
设min=20
设max=35
输出(存储、文件存储、最小值、最大值)

控制台日志(存储)由于这是一个NP难的装箱问题,您不得不以某种方式将程序基于概率

在即时情况下,只需将初始数组随机化,然后根据下限和上限对数组进行线性分组,然后检查bin是否有效,这将非常容易

这里,我有一个具有50个初始值的数组。我允许它最多尝试10000次,但它通常会在前500次尝试中找到一个有效的bin。很多时候,这要快得多

经过多次测试,我没有一个阴性结果:

const testArr=[1,5,4,1.2,3,1.3,3,8,9,1.2,
2.8, 2.1, .7, .3, .7, 1.8, 1.1, .9, .4, 1.2, 1,
2, 1.1, 1.3, .9, 1.8, 1.7, 1.1, 1.3, 2.8, 2.6, 1.4,
2.9, 2.6, 1.1, .5, .2, 1.8, 2.5, 3.4, 2, 2, 2, 4, 3.1,
1.3, 3, 3, 3.5, 2.3];
log(“数组长度:+testArr.length”);
设numatempts=10000;
让rndArray、getBin、binIsValid=false;
对于(i=1;i{
groupTotal=groupTotal+val;
if(组总数<上限){
newGroup.push(val);
如果(i==(rndVals.length-1)){
acc.push(新集团);
}
}否则{
acc.push(新集团);
新组=[];
newGroup.push(val);
groupTotal=val;
如果(i==(rndVals.length-1)){
acc.push(新集团);
}
}
返回acc;
}, []);
}
函数isBinValid(lRange、Urage、bin){
设binValid=true,groupTotal=0;
bin.forEach(组=>{
groupTotal=getGroupTotal(组);
如果(groupTotal=uRange)binValid=false;
});
返回有效;
}
函数getGroupTotal(groupArr){
返回组arr.reduce((a,b)=>a+b,0);
}
函数shuffleArray(数组){
对于(设i=array.length-1;i>0;i--){
设j=Math.floor(Math.random()*(i+1));
设temp=array[i];
数组[i]=数组[j];
数组[j]=温度;
}
返回数组;

}
哇,真是一个巨大的挑战,我喜欢这个,我会努力工作并给你一个回应。函数中的
值是多少?@EstebanMANSART感谢您的积极反馈。函数中的values参数表示在
控制台中调用函数时作为第三个参数传递的值数组。log
Facepalm,我没有看到您的第一行XD最后一个问题,如果文件大小大于上限,我们将仅使用此值创建子数组,或者我们根本不处理它?这是一个NP难问题。不好,我的朋友。使用此数组尝试您的代码
[.4,5,6,7,7,8,9,9,1,1.2,1.4]
,您将看到挂起的
1.4
。尽管如此,您的代码还是有所改进!好的,明白了,所以当最后一个值不能进入其他堆栈但小于minValue=>Fail时。嗯,有趣的是,我不确定是否有时间继续,但如果有,我会尽力给你一个答案;)