Permutationen

Werbung
Permutationen
Auf Eingabe von Zahlen (a1 , . . . , an ) sollen alle Permutationen von (a1 , . . . , an ) erzeugt werden. Dabei nehmen wir an, dass die Zahlen bereits aufsteigend sortiert gegeben sind, also
a1 ≤ · · · ≤ an gilt. Es ist zugelassen, dass manche der Zahlen gleich sind.
Die aktuell berechnete Permutation wird an das Unterprogramm Visit übergeben. In
Visit ist dann die jeweilige Anwendung programmiert. Diese kann zum Beispiel einfach aus
einer Druckanweisung bestehen.
Sei beispielsweise ai = i für i = 1, . . . n. Dann erzeugt Permutations(1, 2, 3) die 6 Permutationen in folgender Reihenfolge:
123, 132, 213, 231, 312, 321
Wird die Eingabesequenz als eine Zahl (zur Basis an + 1) gelesen, hier also 123, so ist dies die
kleinste Zahl die man mit den gegebenen Zahlen bilden kann. Die jeweils nächste Permutation
ist immer die nächst größere Zahl die man bilden kann.
Permutations(a1 , . . . , an )
1 repeat
2
Visit(a1 , . . . , an )
3
j ←n−1
4
while aj ≥ aj+1 do j ← j − 1
5
if j > 0 then
6
k←n
7
while aj ≥ ak do k ← k − 1
8
vertausche aj und ak
9
`←j+1
10
r←n
11
while ` < r do
12
vertausche a` und ar
13
`←`+1
14
r ←r−1
15 until j = 0
Es gelten folgende Invarianten.
Nach Zeile 4 gilt: alle Permutationen, die mit a1 , . . . , aj beginnen sind bereits besucht.
Nach Zeile 7 gilt: aj+1 ≥ · · · ≥ ak−1 ≥ ak > aj ≥ ak+1 ≥ · · · ≥ an .
Nach Zeile 8 gilt: aj+1 ≥ · · · ≥ ak−1 ≥ aj > ak ≥ ak+1 ≥ · · · ≥ an .
Nach Zeile 11 gilt: aj+1 ≤ · · · ≤ an .
Herunterladen