Алгоритм порождения разбиений

Как было сказано выше, разбиение можно интерпретировать как мультимножество {m1·p1,m2·p2,…,ml·pl,}. Например для n=7 все возможные разбиения представлены в табл.2.3.

 

Таблица 2.3

Разбиения числа 7

Разбиение Разбиение
{7·1} = {1,1,1,1,1,1,1} {1·4,3·1} = {4,1,1,1}
{1·2,5·1} = {2,1,1,1,1,1} {1·4,1·2,1·1} = {4,2,1}
{2·2,3·1} = {2,2,1,1,1} {1·4,1·3} = {4,3}
{3·2,1·1} = {2,2,2,1} {1·5,2·1} = {5,1,1}
{1·3,4·1} = {3,1,1,1,1} {1·5,1·2} = {5,2}
{1·3,1·2,2·1} = {3,2,1,1} {1·6,1·1} = {6,1}
{1·3,2·2} = {3,2,2} {1·7} = {7}
{2·3,1·1} = {3,3,1}    

 

Данные разбиения представлены в порядке, где каждое разбиение удовлетворяет условию р1>р2>...>рl. Такой порядок называют словарным. Наиболее эффективно порождать разбиения именно в таком порядке. Для этого, начав с {n·1}, будем переходить от одного разбиения к следующему, рассматривая самый правый элемент разбиения, ml·pl. Если ml×pl достаточно велико (ml>1), можно исключить два pl для того, чтобы добавить еще одно pl+1 (или включить еще одно pl+1, если в текущий момент его нет). Если ml=1, то ml-1×pl-1+ml×pl достаточно велико для того, чтобы добавить pl-1+1. В любом случае то, что остается, превращается в соответствующее число единиц и формируется новое разбиение. Эту процедуру реализует алгоритм представленный на рис.2.12.