将数字数组平均分配到 x 个数字子集

Equally distribute array of numbers into x subsets of numbers

本文关键字:数字 子集 数组 分配      更新时间:2023-09-26

我有一个很大的数字数组,我需要将其分布成x个数字范围,以便每个范围包含来自原始数组的相同数量的元素。

例如,当x = 4 时,以下数组

[1, 1, 2.5, 3, 6, 7, 10, 11.2, 14, 25, 35, 50, 75, 85.5, 100, 120, 128.9, 150, 200, 260]

将生成一个长度x + 1数组

,如下所示
[1, 6.5, 30, 110, 260]
  • 1 是数组中的最小值
  • 6.5 是 6 和 7 的中点
  • 30 是 25 和 35 的中点
  • 110 是 100 和 120 的中点
  • 260 是最大值

从本质上讲,这将给我 4 个范围的数字 1-6.5、6.5-30、30-110 和 110-260。 每个范围将包含原始数组的 5 个数字。

需要能够处理动态数量的元素,这些元素不一定被 x 平均除以。

我在数学上问了这个问题,但被告知这更像是一个编程问题。

根据您的问题,以下 javascript 代码应该满足您的要求,我已经用 x 的几个值测试了它的正确性,但您可能想检查此代码是否适用于您的问题的所有可能的测试用例。

var arr = [1, 1, 2.5, 3, 6, 7, 10, 11.2, 14, 25, 35, 50, 75, 85.5, 100, 120, 128.9, 150, 200, 260, 261, 262, 263, 264, 265];
total_elem = arr.length;
var x = 5;
var each_set_elem = total_elem / x;
var i = 1;
var temp = [];
temp.push(arr[0]);
for (i = each_set_elem; i < total_elem; i += each_set_elem) {
  this_elem = (arr[i] + arr[i - 1]) / 2;
  temp.push(this_elem);
}
temp.push(arr[total_elem - 1]);
console.log(temp);

此代码满足问题中的测试用例,并且对于 x=5,它会吐出正确的 6 个点,以便 5 个范围每个范围都有给定数组集中的 4 个元素。