gpt4 book ai didi

javascript - 等分值算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:25 24 4
gpt4 key购买 nike

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

我有一个数值数组,数量和数值都是随机的例如:

[5,9,14,18,19,29,49,59,89,99,129,159,189,199,259,299,599]

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

我需要将这个数组分成固定数量的组,这样所有的项目数量都接近并且组之间第一项与最后一项的差异不是很大。在这种情况下,我将分成 4 组。

问题:如果我将等量分成 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]

[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]

最佳答案

这是对数据的对数 View 的近似值,并以相等的间隔对其进行分组。

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

test 中,您会得到整数,第一个值始终索引为零,最后一个值小于所需部分的数字(为此,我取一个小于一的因子,因为有人会将最后一项移到数组的所需长度之外)。

var data = [5, 9, 14, 18, 19, 29, 49, 59, 89, 99, 129, 159, 189, 199, 259, 299, 599],
parts = 5,
smallerThanOne = 0.9999999999999999,
interval = Math.log(data[data.length - 1] / data[0]),
test = data.map(function (a) {
return parts * smallerThanOne * Math.log(a / data[0]) / interval;
}),
grouped = data.reduce(function (r, a) {
var i = Math.floor(parts * smallerThanOne * Math.log(a / data[0]) / interval);
r[i] = r[i] || [];
r[i].push(a);
return r;
}, []);


console.log(grouped);
console.log(test);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 等分值算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43254708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com