Разделить список на равные части? - PullRequest
4 голосов
/ 23 октября 2019

У меня есть массив size элементов, и у меня есть функция, которая разбивает его на примерно равные части. Он делает это, устанавливая размер первых size-1 секций с помощью size/num_of_sections, и устанавливая размер последней секции с тем, что осталось. Код прост, работает правильно и выглядит так:

int section_size = size / num_of_sections;
int last_section_size = size - ( section_size * (num_of_sections - 1) );

Единственная проблема состоит в том, что есть некоторые комбинации size и num_of_sections, которые не очень хорошо разделяются. Например, если size = 10 и num_of_sections = 6, то первые четыре раздела будут по 1 элементу каждый, а последний раздел будет состоять из 6 элементов.

Как я могу изменить это на алгоритм, который разделит егоболее равномерно, чтобы все разделы имели размер X или X+1? В приведенном выше примере первые четыре раздела будут иметь размер 2, затем последние два раздела будут по 1 каждый. Очевидно, что должна быть создана третья переменная, которая указывает номер раздела, где все предыдущие разделы вплоть до включительно имеют размер X, а все последующие - размер X+1.

1 Ответ

6 голосов
/ 23 октября 2019

Обычный подход, когда у вас все в порядке с группировкой всех больших кусков, это

const int total=/*…*/,pieces=/*…*/;
const int base=total/pieces,extra=total%pieces;

Тогда первые extra (возможно, 0) кусочки имеют размер base+1 и (* 1006)*) другие имеют размер base.

...