Derinių generavimas leksikografine tvarka

Download Report

Transcript Derinių generavimas leksikografine tvarka

Kombinatorinių objektų generavimo
algoritmai
Derinių generavimas leksikografine
tvarka
Čia priminsime, kad jei į derinį žiūrėsime kaip į skaičių, tai
deriniams atitinkantys skaičiai bus išdėstyti didėjimo tvarka.
Pavyzdys. Panagrinėkime C53
Deriniai, surašyti leksikografine tvarka, bus:
123, 124, 125, 134, 135, 145, 234, 235, 245, 345.
Kaip juos sugeneruoti?
Algoritmas
k
Derinius Cn nuosekliai talpinsime masyve C(k)
ir šio masyvo elementai c1 , c2 ,..., ck apibrėš derinį.
Leksikografine tvarka pats mažiausias derinys yra:
1,2,3,…,k.
Leksikografine tvarka pats didžiausias derinys yra:
n-k+1,…,n-1,n.
Pavyzdžiui:
C74
min: 1,2,3,4
max: 4,5,6,7
Algoritmas
Tarkime, c1 c2 ... cl ... ck – turimas derinys.
c1 c2 c3 c4
2 3 6 7
Vadinasi, cl  n  k  l , l  1, k
Maksimali reikšmė
4 5 6 7
c1 c2 c3 c4
2 3 6 7
c17-4+1=4
c27-4+2=5
c37-4+3=6
c47-4+4=7
Kaip generuoti patį mažiausią
leksikografiškai didesnį derinį nei turimas?
1. Masyve C(k) rasime pirmą iš dešinės elementą cl,
tenkinantį sąlygą
4 5 6 7
c1 c2 c3 c4
2 3 6 7
2 4 5 6
2. Šį elementą padidinsime vienetu
1 l  k
cl  n  k  l
c234=3<5
=7=7
=6=6
cl : cl  1
3. Likusius elementus dešinėje užpildysime iš eilės einančiais
natūraliaisiais skaičiais . (kairėje elementai lieka tie patys)
Tęsinys
4 5 6 7
c1 c2 c3 c4
1 2 5 6
1 2 5 7
1 4 5 6
1
1
1
1
1
1
1 2 6 7
1 3 4 5
ir t.t
2
2
2
2
2
2
3
3
3
3
4
4
4
55
66
77
55
66
1 2 4 77
1
1
1
1
1
3
3
3
3
3
4
4
5
5
6
6
7
6
7
7