javascript - 在分布式环境中拆分数组以找到两个子数组之和之间的最小差异
问题描述
这个问题我昨天被问到了。我必须编写一个代码将数组分成两部分,以便这两部分之和之间的差异最小。
这是我编写的复杂度为O(n)的代码
function solution(a) {
let leftSum = 0;
let rightSum = a.reduce((acc, value) => acc + value ,0);
let min = Math.abs(rightSum - leftSum);
a.forEach((item, i) => {
leftSum += a[i];
rightSum -= a[i];
const tempMin = Math.abs(rightSum - leftSum);
if(tempMin < min) min = tempMin;
})
return min;
}
但是后来有人问我输入数组的长度是否为1000万,我将如何在分布式环境中解决这个问题?
我是分布式编程的新手,需要帮助。
解决方案
如果您有N
节点,则将数组拆分为N
顺序子数组;这将为您提供N
连续的总和。通过一次来确定哪个子数组包含所需的分割点。“之前”和“之后”总和之间的差异是您下一阶段的偏差目标......
现在将该“中间”数组分成N
几部分。再次,您寻找合适的分割点,除了现在您知道您想要的确切结果(因为您有数组总和和缺失的差异)。
重复第二段,直到您可以将整个子数组放入一个节点,这是完成项目计算的最快方法。
您可以通过在每个值处保持累积和来加快速度;这将允许您在每个阶段更快地找到适当的分割点,因为您可以在第一个阶段之后对每个阶段使用二进制或插值搜索。
推荐阅读
- akka - Akka 获取关机例程的死信计数
- php - 如何使用 PHP 将 BLOB 文件转换为服务器中的图像?
- authentication - 多次调用 Servlet 过滤器
- angular - 更新 Angular 中的模型值时响应数据发生变化
- arrays - 从数组 A 构造数组 B,每个索引都是原始数组中第 k 个元素的最大值
- ldap - 在 abp 框架中集成 LDAP 登录
- apache-spark - k8s 上的 Spark 结构化流
- reporting-services - 如何在表格底部获取父列组的总和?
- bash - 为什么在这个语句中使用 xargs
- angular - 如何将枚举参数传递给角度指令