Jeśli dobrze rozumiem, masz podane dwa numery 1 ≤ X ≤ L i chcesz wygenerować wszystkie sekwencje liczb całkowitych dodatnich o długości X że suma L.
(Uwaga: to jest podobne do integer partition problem, ale nie to samo, ponieważ uważamy, że 1,2,2 jest inną sekwencją niż 2,1,2, natomiast w przypadku problemu z partycją całkowitą ignorujemy kolejność, tak, że są one uważane za takie same partycja)
sekwencje którego szukasz odpowiadają combinations z X. - 1 pozycji z L - 1. w przypadku, jeśli stawiamy numery 1 do L - 1 w kolejności i wybierz X - 1 z nich, a następnie długości przerw między wybranymi liczby są liczbami całkowitymi dodatnimi, które sumują się do L.
Na przykład załóżmy, że L jest 16 i X jest 5. Następnie wybierz 4 numery od 1 do 15 włącznie:
Dodaj 0 na początku i na końcu 16 i interwały:
i 3 + 4 + 1 + 6 + 2 = 16 według potrzeby.
Więc generate the combinations z X - 1 elementów z L - 1, a dla każdego z nich, przekształcić go na partycji poprzez znalezienie interwały. Na przykład w Pythonie można napisać:
from itertools import combinations
def partitions(n, t):
"""
Generate the sequences of `n` positive integers that sum to `t`.
"""
assert(1 <= n <= t)
def intervals(c):
last = 0
for i in c:
yield i - last
last = i
yield t - last
for c in combinations(range(1, t), n - 1):
yield tuple(intervals(c))
>>> list(partitions(2, 4))
[(1, 3), (2, 2), (3, 1)]
>>> list(partitions(3, 5))
[(1, 1, 3), (1, 2, 2), (1, 3, 1), (2, 1, 2), (2, 2, 1), (3, 1, 1)]
Istnieje (L - 1)!/(X - 1)! (L - X)!kombinacje X - 1 pozycji z L - 1, więc środowisko wykonawcze tego algorytmu (i rozmiar jego wyjścia) jest wykładnicze w L. Jeśli jednak nie policzysz wyjścia, potrzebujesz tylko przestrzeni O (L).
Z L = 128 i X = 8, istnieją 89,356,415,775 przegródki, więc zajmie to trochę czasu na wyjście nimi wszystkimi!
(Może jeśli wyjaśnić, dlaczego obliczanie tych partycji, możemy być w stanie zaproponować jakiś sposób spełnienia wymagań, bez konieczności rzeczywiście produkują je wszystkie.)
Wydaje mi się, że szukasz * całkowite partycje * 'L' o długości' X'. –
Nie możesz tego zrobić * sprawnie * (w literaturze, wydajnie = wielomianowo). Istnieje wykładnicza liczba rozwiązań, a do iteracji wszystkich wymaga wykładniczy czas. – amit
To byłby świetny problem z eulerem projektu =) –