Здравствуйте, 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. Сразу извиняюсь, если что-то не работает, не проверял, надеюсь, сам принцип понятен