Estoy trabajando en algún código para un clúster débilmente acoplado. Para lograr un rendimiento óptimo durante los trabajos, el clúster reasigna sus datos cada vez que un niño ingresa o sale. Eventualmente, esto se convertirá en opcional, pero por ahora realiza su balance de datos de manera predeterminada. Mi equilibrio es básicamente asegurarme de que cada niño nunca tenga más que el número promedio de archivos por máquina, más uno. El más uno es para el resto si la división no está limpia. Y puesto que el resto se siempre será menor que el número de niños [0, excepto el caso, pero podemos excluir esa], los niños después de un equilibrado tendrán en la mayoría de avg + 1.Algoritmo de distribución equilibrada
Todo parece estar bien, hasta que me di cuenta mi algoritmo es O (n!). Vaya a la lista de niños, descubra el promedio, el resto, que tiene demasiados y que tiene muy pocos. Para cada niño en la lista de demasiados, revise la lista y envíela a cada niño que tenga muy pocos.
¿Hay una mejor solución para esto? Siento que debe haberlo.
Editar: Aquí hay alguna psuedocode para mostrar cómo I derivado O (n!):
foreach (child in children) {
if (child.dataLoad > avg + 1) {
foreach (child2 in children) {
if (child != child2 && child2.dataLoad < avg) {
sendLoad(child, child2)
}
}
}
}
Editar: O (n^2). Foreach n, n => n * n => n^2. ¡Supongo que no tuve suficiente café esta mañana! ;)
En el futuro, me gustaría pasar a un método de distribución más flexible y resistente [ponderaciones y características], pero por ahora, una distribución uniforme de datos funciona.
foreach (infantil en niños) si (child.dataLoad> avg + 1) foreach (child2 en los niños) if (child! = Child2 && child2.dataLoad