Я работаю над кодом для слабосвязанного кластера. Для достижения оптимальной производительности во время работы кластер перераспределяет свои данные каждый раз, когда ребенок входит или выходит. В конечном итоге это станет необязательным, но пока он выполняет балансировку данных по умолчанию. Мой баланс в основном сводится к тому, чтобы у каждого ребенка не было больше, чем среднее количество файлов на машину плюс один. Плюс для остальных, если деление не чистое. И поскольку остаток будет всегда меньше числа детей [кроме случая 0, но мы можем исключить это], дети после балансировки будут иметь максимум avg + 1.
Все выглядит нормально, пока я не понял, что мой алгоритм O (n!). Спуститесь по списку детей, найдите среднее число, остаток, у которого слишком много, а у кого слишком мало. Для каждого ребенка в списке слишком много, просмотрите список, отправьте каждому ребенку, у которого слишком мало.
Есть ли лучшее решение для этого? Я чувствую, что должно быть.
Edit: Вот некоторый psuedocode, чтобы показать, как я получил 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. Я думаю, мне не хватило кофе сегодня утром! ;)
В будущем я хотел бы перейти к более гибкому и устойчивому методу распределения [весам и иерархиям], но сейчас работает равномерное распределение данных.