Re[5]: Распределение нагрузки
От: Attila Россия  
Дата: 23.07.03 12:53
Оценка:
Здравствуйте, Alexan, Вы писали:

A>Есть более интересный пример, когда 3 сервера, а на них записей — 0, 1 и 1000. Надо загрузить 300 записей. По предложенному выше алгоритму получится, что все 300 записей перейдут на первый сервер, а хочется по 150...


Кроме итерационного, ничего в голову не пришло:
Допустим, имеется N серверов. k = N-1
Необходимо добавить z записей.
1) Сортируем массив по возрастанию
2) Далее по тексту

...
var i,j : Integer;
    razn,prom : Integer;
...
i := 1;
while (z > 0) and (i <= k) do begin 
    razn := (serv[i] - serv[0]) * i;
    for j := 0 to i-1 do begin
        // перераспределение записей
        prom := razn div (i-j)
        inc(serv[j],prom); //или положить на j-й сервер prom записей
        dec(razn,prom);
        dec(z,prom);
    end;
    inc(i);
end;


3)После этого если количество оставшихся записей все еще больше 0, их можно разделить между всеми серверами поровну

P.S.Погрешность в данном методе (как, собственно, и во многих других) есть и равна она k-1.

P.P.S. Сразу извиняюсь, если что-то не работает, не проверял, надеюсь, сам принцип понятен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.