Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_Algorithm_Grouping_Division - Fatal编程技术网

Javascript 等分算法

Javascript 等分算法,javascript,arrays,algorithm,grouping,division,Javascript,Arrays,Algorithm,Grouping,Division,我需要一个算法来对一组值进行等分。我将用JavaScript演示,但任何语言都可以应用 我有一个值数组​​具有随机数量和值 例: (我注意到的一个特点是​​指数增长) 我需要将这个数组分成固定数量的组,这样所有的组都有相近数量的项,并且第一个项和最后一个项的差异在组之间不是很大。 在本例中,我将分为4组 问题是: 如果我分成4组,数量相等,可能会出现组中的第一个项目比其他组中的最后一个项目小得多的情况。 如果我分成4组,每个组的值范围相等,那么其中一组相对于其他组的项目可能很少 我想在中间找个地

我需要一个算法来对一组值进行等分。我将用JavaScript演示,但任何语言都可以应用

我有一个值数组​​具有随机数量和值 例:

(我注意到的一个特点是​​指数增长)

我需要将这个数组分成固定数量的组,这样所有的组都有相近数量的项,并且第一个项和最后一个项的差异在组之间不是很大。 在本例中,我将分为4组

问题是: 如果我分成4组,数量相等,可能会出现组中的第一个项目比其他组中的最后一个项目小得多的情况。 如果我分成4组,每个组的值范围相等,那么其中一组相对于其他组的项目可能很少

我想在中间找个地方,但我还没有找到解决办法。 可接受解决方案的示例:

[
    [5,9,14,18,19,29],
    [49,59,89,99],
    [129,159,189,199],
    [259,399,599],
]
如果有人不理解这个问题,请发表评论

应用:显示值范围的过滤器。 它将如下所示:

  • 不到19岁
  • 从29岁到89岁
  • 从99年到159年
  • 从189年到259年
  • 399以上
我不能展示的是这样的东西:

  • 从29到399(非常大的间隔)
谢谢你的帮助


大差异-从小值跳到大值

另一个可行的例子是:

[1, 2, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 19, 20, 21, 22, 25, 32, 33, 34, 35, 36, 38, 39, 40, 48, 49, 50, 55, 56, 57, 60, 61, 62, 70, 72, 73, 74, 75, 80, 100, 150, 300]


这是一个近似值,具有数据的对数视图,并以相等的间隔对其进行分组

它通过计算结果集的索引来推送值

test
中,您会得到一个整数,第一个值的索引总是为零,最后一个值的索引总是小于所需的部分(为此,我采用了一个小于1的因子,因为它会将最后一个项移到数组所需长度之外)

var数据=[5,9,14,18,19,29,49,59,89,99,129,159,189,199,259,299,599],
零件=5,
Smallerthanne=0.9999999999,
interval=Math.log(data[data.length-1]/data[0]),
test=data.map(函数(a){
返回零件*smallerThanOne*Math.log(a/data[0])/interval;
}),
分组=数据。减少(函数(r,a){
var i=数学层(parts*smallerThanOne*Math.log(a/data[0])/interval);
r[i]=r[i]| |[];
r[i].推(a);
返回r;
}, []);
控制台日志(分组);
控制台日志(测试)

.as console wrapper{max height:100%!important;top:0;}
输入数据是什么?我假设您的“小”和“大”基于位数是否正确?组间可接受的间距是多少?需要更多解释,因为所需目标没有边界。如果输入
[a,b]
被分成
1
[a,b]
,则
a
b
之间的差异可以任意大。也许这个术语是相关的,其中给出了集群的数量。显然可以使用。XDreamCodeing-大小与组有关。例如,使用数组
[1,2,5,6,7,8,10,11,12,13,14,15,19,20,21,22,25,32,33,34,35,36,38,39,40,48,49,50,55,56,57,60,62,70,72,74,75,80,100,150,300]
,第一个和第二个子列表在长度上变得非常小,建议只是一种方法。它适用于具有对数空间的等分布值。为了更好地理解,您可以添加更多的用例和想要的结果,最终您尝试了一些代码。
[1, 2, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 19, 20, 21, 22, 25, 32, 33, 34, 35, 36, 38, 39, 40, 48, 49, 50, 55, 56, 57, 60, 61, 62, 70, 72, 73, 74, 75, 80, 100, 150, 300]
[830, 1790,1990,1990,2390,2420,2599,2690,2890,3124,3340,3404,3460,3497,3590,3590,3598,3620,3690,3725,3725,3774,3780,3798,3865,3885,3890,3929,3949,3990,3990,3998,4080,4099,4128,4132,4183,4190,4199,4250,4290,4290,4290,4420,4490,4496,4507,4590,4599,4680,4750,4790,4790,4890,4898,4990,4999,5190,5299,5390,5396,5530,5590]