如何划分价格区间使各区间产品数量大致均等?求优化方案
更优解决方案:按产品数量分段而非价格二分
你的递归二分法问题出在按价格中点切割区间,而非按产品数量来划分。因为产品价格分布不均匀,某些价格段本身产品极少,就算按价格拆分,这些区间的产品数自然会远低于设定的maxNum。
要实现每个区间产品数量大致相同,正确的思路是先按价格排序产品,再按数量分段,最后提取每段的价格区间:
具体步骤
- 把所有产品的价格提取出来,按升序排序,得到有序数组
prices。 - 计算每个区间的目标产品数:比如总产品1000,
maxNum=200,则分成5个区间,每个区间200个产品。 - 遍历排序后的数组,按数量分割,每段的第一个元素是区间下限,最后一个元素是区间上限(可给后一段的下限加极小值,避免价格重复归属问题)。
代码示例(JavaScript)
function splitByProductCount(prices, maxNum) { // 对价格数组升序排序 const sortedPrices = [...prices].sort((a, b) => a - b); const result = []; const total = sortedPrices.length; let startIndex = 0; while (startIndex < total) { // 计算当前区间的结束索引,不超过总长度 const endIndex = Math.min(startIndex + maxNum - 1, total - 1); // 取当前区间的最小和最大价格 const minPrice = sortedPrices[startIndex]; const maxPrice = sortedPrices[endIndex]; result.push(`${minPrice}~${maxPrice}`); startIndex = endIndex + 1; } return result; } // 示例使用: const productPrices = [/* 你的1000个产品价格数组 */]; const intervals = splitByProductCount(productPrices, 200); console.log(intervals);
说明
这种方法直接以产品数量为划分依据,能保证每个区间的产品数最多为maxNum,且所有区间的产品数差异极小(最后一个区间可能少于maxNum,如果总数量不是maxNum的整数倍)。完全避免了原方法中因价格分布不均导致的区间产品数过少的问题。
内容的提问来源于stack exchange,提问作者chints
相关产品推荐
相关产品推荐

