Определить все последовательные подмножества множества {1,2,3,…,n}. Подмножества должны иметь не менее 2 элементов

Мне нужно разделить набор S={1, 2, 3, … , n}, состоящий из последовательных чисел, так, чтобы каждое подмножество имело как минимум 2 элемента (правило 1) и состояло из последовательных чисел (правило 2).

Правила таковы:

  1. Каждое подмножество имеет не менее двух элементов.

  2. Все элементы всех подмножеств являются последовательными.

  3. Все элементы S включены в разбиение.

Примеры:

There is 1 subset for n = 2: 
1 2
There is 1 subset for n = 3:  
1 2 3   
There are 2 subset combinations for n = 4:
1 2 3 4
1 2 - 3 4
There are 3 subset combinations for n = 5:
1 2 3 4 5
1 2 - 3 4 5
1 2 3 - 4 5
There are 5 subset combinations for n = 6:
1 2 3 4 5 6
1 2 - 3 4 5 6
1 2 3 - 4 5 6
1 2 3 4 - 5 6
1 2 - 3 4 - 5 6
There are 8 subset combinations for n = 7:
1 2 3 4 5 6 7
1 2 - 3 4 5 6 7
1 2 3 - 4 5 6 7
1 2 3 4 - 5 6 7
1 2 3 4 5 - 6 7
1 2 - 3 4 - 5 6 7
1 2 - 3 4 5 - 6 7
1 2 3 - 4 5 - 6 7
There are 13 subset combinations for n = 8:
1 2 3 4 5 6 7 8
1 2 - 3 4 5 6 7 8
1 2 3 - 4 5 6 7 8
1 2 3 4 - 5 6 7 8
1 2 3 4 5 - 6 7 8
1 2 3 4 5 6 - 7 8
1 2 - 3 4 - 5 6 7 8
1 2 - 3 4 5 - 6 7 8
1 2 - 3 4 5 6 - 7 8
1 2 3 - 4 5 - 6 7 8 
1 2 3 - 4 5 6 - 7 8
1 2 3 4 - 5 6 - 7 8
1 2 - 3 4 - 5 6 - 7 8
There are 21 subset combinations for n = 9:
1 2 3 4 5 6 7 8 9
1 2 - 3 4 5 6 7 8 9
1 2 3 - 4 5 6 7 8 9
1 2 3 4 - 5 6 7 8 9
1 2 3 4 5 - 6 7 8 9
1 2 3 4 5 6 - 7 8 9
1 2 3 4 5 6 7 - 8 9
1 2 - 3 4 - 5 6 7 8 9
1 2 - 3 4 5 - 6 7 8 9
1 2 - 3 4 5 6 - 6 7 9
1 2 - 3 4 5 6 7 - 8 9
1 2 3 - 4 5 - 6 7 8 9 
1 2 3 - 4 5 6 - 7 8 9
1 2 3 - 4 5 6 7 - 8 9
1 2 3 4 - 5 6 - 7 8 9
1 2 3 4 - 5 6 7 - 8 9
1 2 3 4 5 - 6 7 - 8 9
1 2 - 3 4 - 5 6 - 7 8 9
1 2 - 3 4 - 5 6 7 - 8 9
1 2 - 3 4 5 - 6 7 - 8 9
1 2 3 - 4 5 - 6 7 - 8 9
There are 34 subset combinations for n = 10:
1 2 3 4 5 6 7 8 9 10
1 2 - 3 4 5 6 7 8 9 10
1 2 3 - 4 5 6 7 8 9 10
1 2 3 4 - 5 6 7 8 9 10
1 2 3 4 5 - 6 7 8 9 10
1 2 3 4 5 6 - 7 8 9 10
1 2 3 4 5 6 7 - 8 9 10
1 2 3 4 5 6 7 8 - 9 10
1 2 - 3 4 - 5 6 7 8 9 10
1 2 - 3 4 5 - 6 7 8 9 10
1 2 - 3 4 5 6 - 6 7 9 10
1 2 - 3 4 5 6 7 - 8 9 10
1 2 - 3 4 5 6 7 8 - 9 10
1 2 3 - 4 5 - 6 7 8 9 10
1 2 3 - 4 5 6 - 7 8 9 10
1 2 3 - 4 5 6 7 - 8 9 10
1 2 3 - 4 5 6 7 8 - 9 10
1 2 3 4 - 5 6 - 7 8 9 10
1 2 3 4 - 5 6 7 - 8 9 10
1 2 3 4 - 5 6 7 8 - 9 10
1 2 3 4 5 - 6 7 - 8 9 10
1 2 3 4 5 - 6 7 8 - 9 10
1 2 3 4 5 6 - 7 8 - 9 10
1 2 - 3 4 - 5 6 - 7 8 9 10
1 2 - 3 4 - 5 6 7 - 8 9 10
1 2 - 3 4 - 5 6 7 8 - 9 10
1 2 - 3 4 5 - 6 7 - 8 9 10
1 2 - 3 4 5 - 6 7 8 - 9 10
1 2 - 3 4 5 6 - 7 8 - 9 10
1 2 3 - 4 5 - 6 7 - 8 9 10
1 2 3 - 4 5 - 6 7 8 - 9 10
1 2 3 - 4 5 6 - 7 8 - 9 10
1 2 3 4 - 5 6 - 7 8 - 9 10
1 2 - 3 4 - 5 6 - 7 8 - 9 10

Я не записывал их здесь, но существует 55 комбинаций подмножеств для n = 11 и 89 комбинаций подмножеств для n = 12.

Мне нужно написать код Visual Basic, в котором перечислены все возможные группы подмножеств для n. Я думал над решением в течение нескольких дней, но кажется, что решение проблемы выходит за рамки моих возможностей. Количество необходимых вложенных циклов увеличивается с увеличением n, и я не мог понять, как программировать вложенные циклы с увеличением числа. Любая помощь будет оценена.

После некоторых исследований я обнаружил, что это проблема «композиций n со всеми частями> 1», а общее количество возможных композиций - это числа Фибоначчи (Fn-1 для n).


person fdikbas    schedule 02.03.2015    source источник
comment
Для n=3, почему бы не {1,2} и {2,3}?   -  person Ari    schedule 02.03.2015
comment
Для n=3; когда подмножество равно {1, 2}, единственным оставшимся числом будет 3, и это будет противоречить правилу 1, согласно которому каждое подмножество должно иметь как минимум 2 элемента, а когда подмножество равно {2, 3}, единственным оставшимся числом будет 1 и это будет против правила 1 снова. Таким образом, единственным возможным подмножеством является {1, 2, 3} для n = 3.   -  person fdikbas    schedule 02.03.2015
comment
Я не понимаю, как, имея {1,2}, вы нарушаете правило 1, потому что подмножество {1,2} состоит из двух элементов. Ваша формулировка проблемы немного неясна. Похоже, вы пытаетесь решить эту проблему: разбейте множество S на подмножество s1, ...,sn (правило 3), где каждое si имеет как минимум 2 элемента (правило 1) и состоит из последовательных чисел (правило 2).   -  person Ari    schedule 02.03.2015
comment
Да, именно, я пытаюсь решить проблему, которую вы указали. Каждое подмножество должно иметь как минимум два элемента, и при делении {1,2,3} на {1,2} и {3} или {1} и {2,3} правило 1 нарушается. Например, вы не можете разделить {1,2,3,4,5} на подгруппы {1,2},{3,4} и {5},   -  person fdikbas    schedule 02.03.2015


Ответы (2)


Мы уже знаем ответ для этих случаев (как вы написали в своих примерах):

  1. n=2
  2. n=3
  3. n=4

Для n=5:

  • Вы можете разбить на 2: 1 2 - 3 4 5. Это похоже на разделение набора из 5 элементов на два набора, первый n = 2, а второй n = 3. Теперь мы можем продолжить деление каждой половины, но мы уже знаем решения при n=2 и n=3!
  • Вы можете разделить 3: 1 2 3 - 4 5. Это похоже на разделение набора из 5 элементов на два набора, первый n = 3, а второй n = 2. Теперь мы можем продолжить деление каждой половины, но мы уже знаем решение при n=2 и n=3!

Для n=6:

  • Вы можете разделить на два набора из 2: 1 2 - 3 4 5 6. Это похоже на разделение набора из 6 элементов на два набора, первый n = 2, а второй n = 4. Теперь мы можем продолжить деление каждой половины, но мы уже знаем решение при n=2. Решите вторую половину, предполагая, что n=4!
  • Вы можете разделить на два набора из 3: 1 2 3 - 4 5 6. Это похоже на разделение набора из 6 элементов на два набора, первый n = 3, а второй n = 3. Теперь мы можем продолжить делить каждую половину, но мы уже знаем решение при n=3 и n=3!
  • Вы можете разделить на два набора из 3: 1 2 3 4 - 5 6. Это похоже на разделение набора из 6 элементов на два набора, первый n = 4, а второй n = 2. Теперь мы можем продолжить делить каждую половину. Решите первую половину, установив n=4. Для второй половины мы уже знаем решение при n=2!

Это простое рекурсивное отношение. Общий случай:

Partition (S): (where |S|>4)
- For i from 2 to |S|-2, partition the given set into two halves: s1 and s2 from i (s1={1,...,i}, s2={i+1,...,n}), and print the two subsets as a solution.
- Recursively continue for each half by calling Partition(s1) and Partition(s2)

---

Другое, возможно, более сложное решение состоит в том, чтобы предположить, что мы делим числа 1 to n на n частей, где длина каждой части может быть либо 0, 2, либо числом больше 2. Другими словами, пусть xi будет длиной каждого раздела:

x1 + x2 + ... xn = n, where the range of xi is: {0} + [2,n]

Эту систему линейных неравенств можно решить методами, описанными здесь< /а>.

person Ari    schedule 02.03.2015
comment
Большое спасибо, Ари. Я продолжу свою работу в указанном Вами направлении. Ваш ответ окажет большую помощь... :) - person fdikbas; 03.03.2015
comment
Добро пожаловать. К вашему сведению, общий случай рекурсии также можно записать для |S|›3 вместо 4. - person Ari; 03.03.2015

Мой ответ вам - попытаться придумать рекуррентное отношение данного шаблона. Думайте рекурсивно. Как я могу разбить эту проблему на более мелкие подзадачи, пока не достигну наименьшей проблемы. Решите эту самую маленькую проблему. После решения этой наименьшей проблемы подумайте об индукции. Предположите, каким будет n-й шаг и как вы достигнете (n+1)-го шага. Попробуйте решить этот (n+1)-й шаг. Как только вы пришли к рекуррентному соотношению для заданного шаблона, не должно быть слишком сложно подумать о том, как рекурсивно решить этот шаблон. Вместо того, чтобы пытаться использовать вложенные циклы, этот подход может быть более интуитивным.

person James Combs    schedule 02.03.2015
comment
Спасибо, Джеймс, я выяснил рекуррентные отношения между секционированными наборами при увеличении n, но не смог написать для этого код. Сейчас попробую написать по описанной Ари методике. - person fdikbas; 03.03.2015
comment
Без проблем. Рад, что смог помочь вам немного яснее взглянуть на проблему. - person James Combs; 05.03.2015