Название этого поста немного вводит в заблуждение. Случайное целочисленное разбиение по умолчанию не ограничено , что означает, что оно может содержать как можно больше частей любого размера. Конкретный вопрос касается разбиения n на m частей, что является типом ограниченного целочисленного разбиения.
Для генерации неограниченных целочисленных разбиений очень быстрый и простой алгоритм принадлежит Фристедту в статье под названием Структура случайных разбиений большого целого числа (1993) . Алгоритм выглядит следующим образом:
- Установите x = exp (-pi / sqrt (6n)).
- Генерация независимых случайных величин Z (1), Z (2), ..., Z (n), где Z (i) геометрически распределен с параметром 1-x ^ i.
- ЕСЛИ сумма i * Z (i) = n, где сумма берется по всем i = 1,2, ..., n, затем STOP.
В противном случае, повторите 2.
Как только алгоритм останавливается, тогда Z (1) - это число , равное 1 с , Z (2) - это число , равное 2 с и т. Д., В разделе, выбранном равномерно при случайным образом. Вероятность принятия случайно выбранного набора Z равна асимптотически 1 / (94n ^ 3) ^ (1/4), что означает, что можно было бы запустить этот алгоритм O (n ^ (3/4)), прежде чем принять один образец.
Причина, по которой я потратил время на объяснение этого алгоритма, заключается в том, что он напрямую относится к задаче генерации разбиения n на ровно m частей. Во-первых, обратите внимание, что
Количество разбиений n на ровно m частей равно числу разбиений n с наибольшей частью, равной m.
Тогда мы можем напрямую применить алгоритм Фристедта, но вместо генерации Z (1), Z (2), ..., Z (n) мы можем генерировать Z (1), Z (2), ... , Z (m-1), Z (m) +1 (здесь +1 гарантирует, что наибольшая часть в точности равна m, а 1 + Z (m) по распределению равно Z (m), условному для Z (m) > = 1) и установите все остальные Z (m + 1), Z (m + 2), ... равными 0. Затем, как только мы получим целевую сумму на шаге 3, мы также гарантируем несмещенную выборку. Чтобы получить разбиение n на ровно m частей, просто возьмите сопряженное сгенерированное разбиение.
Преимущество этого рекурсивного метода Нидженхуйса и Уилфа в том, что нет никаких требований к памяти, кроме хранения случайных величин Z (1), Z (2) и т. Д. Кроме того, значение х может быть любым между 0 и 1, и этот алгоритм все еще беспристрастен! Однако выбор правильного значения x может сделать алгоритм намного быстрее, хотя выбор на шаге 1 почти оптимален для неограниченных целочисленных разбиений.
Если n действительно велико, а алгоритм Фристедта занимает слишком много времени (и о табличных методах не может быть и речи), то есть другие варианты, но они немного сложнее; см. мой тезис https://sites.google.com/site/stephendesalvo/home/papers для получения дополнительной информации о вероятностных принципах «разделяй и властвуй» и их приложениях.