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

Как было сказано выше, разбиение можно интерпретировать как мультимножество { m 1· p 1, m 2· p 2,…, 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.

 
 




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: