Я работаю над некоторым кодом для слабосвязанного кластера. Для достижения оптимальной производительности во время работы у меня есть кластер переназначить свои данные каждый раз, когда ребенок входит или выходит. В конечном итоге это станет необязательным, но пока оно выполняет балансировку данных по умолчанию. Моя балансировка в основном заключается в том, чтобы убедиться, что каждый ребенок никогда не имеет больше, чем среднее количество файлов на машину, плюс один. Плюс один для остальных, если деление не чисто. А так как остаток будет всегда будет меньше, чем количество детей [кроме 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)
}
}
}
}
Edit: O (N^2). Foreach n, n => n * n => n^2. Наверное, мне не хватило кофе этим утром! ;)
В будущем я хотел бы перейти к более гибкому и гибкому методу распределения [веса и hueristics], но на данный момент работает равномерное распределение данных.
Еогеасп (ребенок у детей) если (child.dataLoad> ср + 1) foreach (ребенок2 у детей) если (ребенок! = Ребенок2 && child2.dataLoad