我正在为松散耦合的集群编写一些代码。为了在作业期间实现最佳性能,我让集群在每次孩子进入或退出时重新映射其数据。这最终将成为可选的,但目前它默认执行其数据平衡。我的平衡基本上只是确保每个孩子的文件数量永远不会超过每台机器的平均文件数,再加上一个。如果除法不干净,则加一用于余数。而且由于余数总是小于孩子的数量[除了 0 的情况,但我们可以排除这种情况],平衡后的孩子最多 avg + 1。
一切似乎都很好,直到我意识到我的算法是 O(n!)。顺着孩子的名单往下看,找出平均数,余数,谁有太多,谁有太少。对于太多列表中的每个孩子,遍历列表,发送给每个太少的孩子。
有没有更好的解决方案?我觉得应该有。
编辑:这里有一些伪代码来展示我是如何导出 O(n!) 的:
foreach ( child in children ) {
if ( child.dataLoad > avg + 1 ) {
foreach ( child2 in children ) {
if ( child != child2 && child2.dataLoad < avg ) {
sendLoad(child, child2)
}
}
}
}
编辑:O(n^2)。Foreach n, n => n*n => n^2。我想我今天早上没有喝足够的咖啡!;)
将来我想转向更灵活和有弹性的分布方法[权重和启发式],但现在,数据的统一分布是可行的。