
本文介绍一种基于整数均值分配的 php 数组均衡算法:在保持总和不变的前提下,将数组各元素调整为尽可能接近的整数,使最大值与最小值之差不超过 1,并优先向左侧元素分配余数。
本文介绍一种基于整数均值分配的 php 数组均衡算法:在保持总和不变的前提下,将数组各元素调整为尽可能接近的整数,使最大值与最小值之差不超过 1,并优先向左侧元素分配余数。
在数据处理、资源分配或负载均衡等场景中,常需将一组整数“再平衡”为数值尽可能一致的新数组,同时严格保持原始总和不变(即不增不减、无舍入误差)。由于目标值可能非整数,而实际应用通常要求结果为整数,因此核心策略是:计算向下取整的商(quotient)与余数(remainder),将余数以 1 为单位逐一分配给前 r 个位置,从而确保所有元素为整数、总和守恒、且分布最均匀。
具体步骤如下:
- 计算原数组总和 sum 和长度 len;
- 求整除商 q = floor(sum / len) 和余数 r = sum % len;
- 构造新数组:前 r 个元素为 q + 1,其余为 q。
该方法保证:
- 新数组总和 = r × (q + 1) + (len − r) × q = r×q + r + len×q − r×q = len×q + r = sum ✅
- 所有元素为整数,且仅存在两种取值:q 或 q + 1,差值恒为 1(或全等)✅
- 分配具有确定性与可重现性(左对齐优先)✅
以下是完整、可运行的 PHP 实现:
立即学习“PHP免费学习笔记(深入)”;
<?php
function rebalanceArray(array $arr): array {
if (empty($arr)) {
return [];
}
$sum = array_sum($arr);
$len = count($arr);
$q = intdiv($sum, $len); // 等价于 (int)($sum / $len),更安全
$r = $sum % $len;
$result = [];
for ($i = 0; $i < $len; $i++) {
$result[] = ($i < $r) ? $q + 1 : $q;
}
return $result;
}
// 示例 1
$arr1 = [2, 4, 1, 2];
print_r(rebalanceArray($arr1));
// 输出: Array ( [0] => 3 [1] => 2 [2] => 2 [3] => 2 )
// 示例 2
$arr2 = [2, 3, 1, 2];
print_r(rebalanceArray($arr2));
// 输出: Array ( [0] => 2 [1] => 2 [2] => 2 [3] => 2 )
?>⚠️ 注意事项:
- 本算法适用于非负整数输入,若含负数,intdiv 与 % 行为仍正确,但“均衡”语义需结合业务重新定义;
- 原始键名(如 [1] => 2 中的数字键)在简单索引数组中会重置为 0,1,2,...;如需保留关联键,可改用 array_keys($arr) 遍历并映射;
- 若需随机分配余数(而非左对齐),可先打乱键序再分配,再按原键排序还原——但会牺牲确定性;
- 时间复杂度 O(n),空间复杂度 O(n),高效适用于千级以内数据。
总结:该方案以数学严谨性与工程简洁性兼顾的方式,解决了整数约束下的最优均衡问题,是 PHP 中轻量、可靠、易扩展的标准解法。



















