introducere
Acest articol prezintă un număr de partiții clasice combinatorii, cum ar fi mozhestv partiție și numere, plasarea și combinații, permutări, coeficienții binomiali și colab.), Și algoritmi pentru generarea de obiecte combinatorii.
Studiind diverse obiecte combinatorii, noi, în primul rând, vom răspunde la o serie de probleme clasice:
1. Cum mulți membri cuprinde studiat mulți?
2. Cum pot trece prin elementele setului?
3. Cum pot enumera aceste elemente? Aceasta este, după cum se cunoaște numărul de elemente n, pentru a forma o corespondență între elementele și numerele 1 :. N?
Bust 0-1 vectori
Pentru comoditate, considerăm ca un set de testare de obiect combinatorie Bm a m seturi de zerouri și cele. Pentru acest set va da răspunsuri la întrebări.
Se înțelege că o multitudine de seturi de m zero-uri și cele care conțin elemente exact 2m.
Pentru a crea un proces de calcul, în care în fiecare etapă va forma noi, nu înainte de văzut, elementul setului considerat, este suficient să se constate că există o corespondență între numărul de 0 ... 2m # 8722; 1 și 0-1 seturi de vectori. E. suficient pentru a lua primul număr 0 și reprezentarea binară de la 0, ..., 0, și apoi doar adăugați pe unitate prin simularea-l pe setul actual, până când vom ajunge la setul de toate cele.
De asemenea, considerate seturi exhaustive metodă de căutare poate oferi un algoritm diferit la fiecare pas care modifică valoarea unei singure componente. Acest algoritm se bazează pe ideea recursivitatii.
1. Reparăm valoarea componentei zero, m-lea și itera toate seturile de lungime m # 8722; una pentru componentele rămase.
2. Schimbarea valorii componentei m-lea de la 0 la 1. Bucla prin seturi de lungime m # 8722; 1 în ordine inversă.
Aici este un tabel care prezintă un seturi de proces de enumerare de lungime 4. coloană indică numărul iterației curente, iar coloana kit - numărul de componente care trebuie să fie actualizate.
De asemenea, puteți răspunde la ușurință la întrebarea cu privire la modul în care să enumerăm o colecție de seturi. Într-adevăr, setul curent al setului - reprezentarea binară a unui număr, și care este numărul nostru stabilit. Astfel, putem asocia fiecare set de echivalentul său numeric.
coduri gri
Anterior am considerat un algoritm recursiv busting 0-1 seturi. Acest algoritm face posibil pentru a sorta toate seturile Bm, astfel încât fiecare set următor diferită de cea anterioară numai într-o singură categorie. Construite folosind algoritmul o secvență de seturi (date în tabel) se numește cod Gray. In general, n-bit cod Gray - un (eventual ciclic) secvență ordonată constând din cuvintele de cod de n biți 2n, fiecare dintre ele diferă de adiacente una descărcare.
Aici (de data aceasta nonrecurrent) algoritmul pentru generarea de coduri Gray. Să considerăm codul binar Gray de ordinul n. Astfel, algoritmul este aplicat la intrarea unui singur număr n, care specifică ordinea codului Gray. Pe parcursul algoritmului, obținem secvența de toate subgrupurile set element n, în care fiecare subset succesive obținute din cele de mai sus, prin adăugarea sau îndepărtarea unui singur element (cea mai mică schimbare posibilă) - cod Gray. În care fiecare subset este reprezentat de secvențe binare B [1], ..., B [n].
Gray-Generation (n)
1 pentru i: = 1 la n do B [i]: = 0;
2 i: = 0;
3 repeta
4 scriere (B [i], ..., B [n]);
5 i: = i + 1; p: = 1; j: = i;
6 în timp ce j mod 2 = 0 do
7 începe
8 j: = j / 2; p: = p + 1;
9 final;
10 în cazul în care p # 8804; n atunci B [p]: = 1 # 8722; B [p];
11 până la p> n
Dovada corectitudinea algoritmului poate fi găsită în [1].
Subseturile de secvență obținută este ilustrată într-un grafic (cub n-dimensional), ale căror vârfuri corespund secvențelor binare de lungime n și două vârfuri sunt conectate printr-o muchie dacă secvențele corespunzătoare sunt diferite într-o singură poziție. Apoi, această secvență corespunde unei căi Hamiltonian în acest grafic, t. E. Calea care conține fiecare nod al grafului doar o singura data.
Parcurge produsul direct al seturilor
Dacă luăm în considerare oricare două seturi A și B, atunci noi le vom numi directe produs (cartezian) (A # 215; B) stabilește A și B, mulțimea tuturor perechilor ordonate (i, j), unde i # 8712; A, j # 8712; B. Puterea este setată atunci când produsul cartezian rezultat de seturi este egal cu produsul dintre capacitatea acestor seturi.
Mai mult decât atât, putem determina produsul direct al oricărui număr finit de seturi. De exemplu, dacă luăm în considerare doar un singur set de specimene, constând din două elemente de 0 și 1, produsul direct al m astfel de cazuri va fi o pluralitate de rascmotrennoe anterior Bm.
Astfel, considerăm produsul direct al seturi k: M1 # 215; M2 # 215; ... # 215; Mc. Este evident că
| M1 # 215; M2 # 215; ... # 215; Mc | = # 8719; i # 8712; 1: k mi,
unde mi = | Mi | - numărul de elemente ale setului Mi.
Să setul Mi este format din numere întregi între 0 și mi # 8722; 1, i # 8712; 1: k. Apoi, fiecare element al produsului direct al M1 # 215; M2 # 215; ... # 215, Mk poate fi reprezentat ca o secvență de numere întregi r1 non-negative, r2, ..., rk, unde 0 # 8804; ri
num (r1, r2, ..., rk) = # 8721; i = 1: k ri # 215; # 8719; j = 1: i # 8722; 1 mj.
permutări
Permutare n-element de set X - este o functie one f evaluate: X → X. În cazul în care, pentru simplitate, ia X =, acesta poate fi numit o permutare de un set ordonat de numere n distincte situate în intervalul de la 1 la n (în continuare se va vedea acest lucru este cazul).
Notăm mulțimea tuturor permutări de X prin Sn. Este clar că | Sn | = N. . T. în seta primul rând puteți pune orice număr de n posibil, pe al doilea - oricare dintre n # 8722, 1 stânga și așa mai departe până la ultima poziție în care am pus ultimul element rămas: .. Ca rezultat, vom obține produsul care va fi factorial n.
Luați în considerare setul de Mi din partea anterioară. Să presupunem că Mi fiecare va reprezenta un set de numere de la 0 la I # 8722; 1. Notăm produs de n astfel Tn seturi. Apoi, în cazul în care va exista o corespondență între Sn si Tn, putem, în special, pentru a renumerota toate permutările de Sn. Noi producem mecanismul de tranziție de la permutare r1, ..., rn # 8712; Sn la t1 elementului, ..., tn # 8712; Tn. Pentru a face acest lucru pentru fiecare I # 8712; 1: n găsi valorile numerice poziția S i în permutare (rs = i) și ia ca ti număr mai mic de elemente, printre i r1, ..., rs # 8722; 1. Și poate fi utilizat tranziția inversă de la elementul la interschimbul că locul oricărui element i (de la cea mai mare) este unul mai mare decât numărul de elemente anterioare i, iar numărul în sine este egal cu ti sumă și numărul de elemente, mari i.
În plus, fiecare permutare f # 8712; Sn poate fi reprezentat printr-un grafic direcționat cu setul de noduri X =, în care se extinde de la coaste x la y, unde f (x) = y. Se poate demonstra cu ușurință că un astfel de grafic constă dintr-un număr de cicluri elementare cu diferite seturi de noduri, care se adaugă până la o mulțime de X. e. Fiecare permutare ne putem extinde în cicluri. De exemplu, să considerăm un permutare F (1234567) = 7514236 și împărțiți-l în cicluri:
permutări Generarea
Vom introduce unele notație pentru scrierea algoritmilor. permutarea elementelor vor fi stocate ca elemente în matrice P [1], ..., P [n]. Valorile de schimb ale variabilelor vor fi notate cu P [i]: =: P [j]. Reamintim că luăm în considerare numai permutarea definită pe mulțimea X =.
Pe platoul de filmare Sn cere ordine lexicografică:
(X1, ..., xn) <(y1, …, yn) ⇔ существует k ≥ 1, такое что xk ≤ yk и xl = yl для каждого l
(X1, ..., xn) <(y1, …, yn) ⇔ существует k ≤ n, такое что xk> Yak și xl = il pentru fiecare l> k.
Acum, imaginați-vă un algoritm pentru a genera toate permutările în ordine antileksikograficheskom. Rețineți că acest lucru este un algoritm recursiv.
1 Procedura REVERSE (m);
2 începe i: = 1; j: = m;
3 în timp ce i
5 end
6 final
7 Procedura ANTYLEX (m);
8 începe
9, în cazul în care m = 1, atunci
10 scriere (P [1], ..., P [n])
11 altceva
12 pentru i: = 1 la m face
13 începe ANTYLEX (m # 8722; 1);
14 dacă am
16 final
17 final
18 final;
19 începe
20 pentru i: = 1 la n do P [i]: =: i;
21 ANTYLEX (n)
22 final
Numărul mediu de transpunere atribuit fiecărui permutare este aproximativ egal cu 1,543, t. E. Pentru a genera n! permutări utilizate aproximativ 3.077n! comparații.
Puteți oferi un algoritm mai rapid, în care fiecare permutare succesive este generată de cea anterioară numai printr-o transpunere. Aici permutare algoritmul de generare pentru numărul minim de transpoziții:
1 Procedura B (m, i);
2 începe
3 if (m mod 2 = 0) și (m> 2), atunci
4 dacă i
6 altceva B: = m # 8722; 1
7 final;
8 Procedura PERM (m);
9 începe
10 în cazul în care m = 1, atunci
11 scriere (P [1], ..., P [n])
12 altceva
13 pentru i: = 1 la m face
14 începe PERM (m # 8722; 1);
15 dacă am
17 final;
18 începe
19 pentru i: = 1 la n do P [i]: =: i;
20 PERM (n)
21 final
Dovada corectitudinea algoritmului poate fi găsită în [1].
Cu toate acestea, există un algoritm mai rapid pentru a genera permutări, construiește permutarea secvență, în care fiecare următorul format din cel anterior printr-o transpunere unică a elementelor adiacente. Notăm PR [i] informații variabile care conțin booleană dacă elementul i este transferat mai departe (PR [i] = true) sau înapoi. Peremennnaya C [i] se va arăta care dintre posibilele n # 8722; i + 1 poziție a elementului i preia elementele i + 1, ..., n este pe drum înainte și înapoi. Aici este codul:
1 începe
2 pentru i: = 1 la n do
3 începe P [i]: = i; C [i]: = 1; PR [i]: = true;
4 final;
5 C [n]: = 0;
6, scrie (P [1], ..., P [n]);
7 i: = 1;
8 în timp ce i
10 în timp ce C [i] = n # 8722; i + 1 fac
11 începe PR [i]: = nu PR [i]; C [i]: = 1;
12 dacă PR [i] x: = x + 1;
13 i: = i + 1;
14 final;
15 dacă am
17 dacă PR [i] atunci k: = C [i] + x;
18 k altceva: = n # 8722; i + 1 # 8722; C [i] + x;
19 P [k]: =: P [k + 1];
20 de scriere (P [1], ..., P [n]);
21 C [i]: = C [i] + 1
22 final
23 final
24 final
visualizers Pe acest subiect pot fi găsite [3] și [4].
Permutarea secvenței obținute prin utilizarea acestui algoritm are o interpretare interesantă. Astfel, dacă luăm în considerare grafic, care corespund tuturor permutărilor VESCINE și în care două vârfuri corespunzând permutările f și g sunt conectate printr-o margine dacă f g este format dintr-o singură transpunere a elementelor adiacente, secvența rezultată este o cale Hamiltonian în acest grafic. Figura prezintă un grafic de secvență pentru n = 3, 4.
Problema minimă a produsului scalar
Perstanovki adesea găsit în cele mai diverse domenii ale matematicii și sunt utilizate în diferite sarcini. De exemplu, ia în considerare o schimbări de utilizare non-algebrice în următoarea problemă extremale: dat numere de 2m x1, ..., xm și y1, ..., ym, trebuie să găsească o partiție de numere în perechi (xi, yj), în cazul în care valoarea sumei formate din produsele numerele fiecărui cuplurile vor fi mai mici.
Este ușor de a arăta că soluția la această problemă se realizează prin compararea secvenței de creștere și descreștere secvență yi xi t. E. Secventele aranjate în ordine inversă.
Plasarea și cuplarea
Plasarea n elemente de m - este un ordonat (aici ne comanda este importanta) un set de m diferite numere întregi situate în intervalul de la 1 la n (de exemplu, .. # 8712; X). Cu alte cuvinte, cazare - acest set cu repetiții. Notăm numărul de elemente prin An, m.
Pentru a calcula valoarea unui, m, trebuie să urmeze același raționament ca și în cazul permutări. Apoi vom obține următorul rezultat:
O, m = n! # 8260; (N # 8722; m)!
Căutați și alocările de numerotare sunt în general similare cu operațiunile corespunzătoare cu permutări. Luarea în considerare a acestor întrebări oferite cititorului ca un exercițiu util.
Combinația de elemente de n m - este un set neordonat (pluralitate) de m numere diferite aparținând X. set denotă numărul de elemente în combinații, prin Cn, m.
Deoarece. Combinație este un set neordonat, atunci fiecare astfel de set corespunde m! locuință (m. e. același set ordonat de elemente). Apoi am descoperit că
Cn, m = n! # 8260; m (n # 8722; m) !!
Poate provoca unele dintre proprietățile de combinații:
1. Cn, m = Cn, n # 8722; m
2. Cn, m + Cn, m + 1 = Cn + 1, m + 1
3. Cn, m * Cm, k = Cn, k * Cn # 8722; k, m # 8722; k
Aceste proprietăți rezultă din definițiile ei înșiși și sunt verificate imediat.
Acum, pentru o serie de combinații algoritmul de generare în ordine lexicografică:
1 începe
2 pentru i: = 1 la k face A [i]: = i;
3 p: = k;
4 în timp ce p # 8804; 1 do
5 începe a scrie (A [1], ..., A [k]);
6, în cazul în care A [k] = n atunci p: = p # 8722; 1 altceva p: = k;
7, dacă p # 8805; 1 atunci
8 pentru i: = k downto p do A [i]: = A [p] + i # 8722; p + 1
9 sfârșitul
10 final
Disponibil Visualizer [5] al prezentului algoritm.
Combinații de numerație pot fi aranjate folosind proprietatea 2) combinațiile de mai sus. În acest scop, fiecare combinație de n de vector asociat m n de zero-uri și altele. In acest vector ar m unități, iar numărul de combinații va stabili numărul acestor unități. Apoi, acest vector poate fi, la rândul său, pentru a compara traiectoria în care unitățile corespund unei trepte orizontale și zerouri - verticală. Apoi, formula pentru numărul va vyglyaet ca
num (b [1: n], m) = <если b[n] = 0, то num(b[1:n−1], m); если b[n] = 1, то Cn−1,m + num(b[1:n−1], m−1)>,
unde b [1: n] - 0-1 vector de n elemente.
teorema binom
În cazul în care nodurile cadranul pozitiv al dreptunghiular de coordonate cu zăbrele a pus numărul de căi de la origine la aceste site-uri și rotiți grătarul astfel încât originea a fost la partea de sus, obținem triunghiul lui Pascal:
Pe acest triunghi este convenabil să ia în considerare numărul de combinații pentru setări mai mici. Mai mult decât atât, cu acest sistem asociat formula binom:
(A + b) n = # 8721; k = 0: n Cn, kakbn # 8722; k
În această formulă, gradul de divulgare coeficienții binomiali algebrice de puteri coincid cu numărul de combinații. Pe baza valorii Cn formula Newton, m este, de asemenea, numit coeficienții binomiali. Unele proprietăți interesante ale Binomul lui Newton au fost luate în considerare în [2].