Sei sulla pagina 1di 9

Calcolo combinatorio

Da Wikipedia, l'enciclopedia libera.

Il calcolo combinatorio è il termine che denota tradizionalmente la branca della matematica che
studia i modi per raggruppare e/o ordinare secondo date regole gli elementi di un insieme finito di
oggetti. Il calcolo combinatorio si interessa soprattutto di contare tali modi, ovvero le
configurazioni e solitamente risponde a domande quali "Quanti sono...", "In quanti modi...",
"Quante possibili combinazioni..." ecc.

Più formalmente, dato un insieme S di n oggetti si vuole contare le configurazioni che possono
assumere k oggetti tratti da questo insieme. Prima di affrontare un problema combinatorio bisogna
capire due fatti importanti:

• Se l'ordinamento è importante, ovvero se due configurazioni sono le stesse a meno di un


riordinamento ((x,y,z) è uguale a (z,x,y)?)
• Se si possono avere più ripetizioni di uno stesso oggetto, ovvero se uno stesso oggetto
dell'insieme può o meno essere riusato più volte all'interno di una stessa configurazione.

Indice
[nascondi]

• 1 Permutazioni semplici (senza ripetizioni)


• 2 Permutazioni con ripetizioni
• 3 Dismutazioni
• 4 Disposizioni semplici (senza ripetizioni)
• 5 Disposizioni con ripetizioni
• 6 Combinazioni semplici (senza ripetizioni)
• 7 Combinazioni con ripetizioni
• 8 Osservazione linguistica
• 9 Voci correlate

Permutazioni semplici (senza ripetizioni) [modifica]


Una permutazione di un insieme di oggetti è una presentazione ordinata, cioè una sequenza, dei suoi
elementi nella quale ogni oggetto viene presentato una ed una sola volta. Per contare quante siano le
permutazioni di un insieme con n oggetti, si osservi che il primo elemento della configurazione può
essere scelto in n modi diversi, il secondo in (n - 1), il terzo in (n - 2) e così via sino all'ultimo che
potrà essere preso in un solo modo essendo l'ultimo rimasto. Dunque, indicando con Pn il numero
delle possibili permutazioni, si ottiene che esse sono esattamente n! (n fattoriale):

Ad esempio le permutazioni degli elementi dell'insieme {a,b,c} sono 3! = 6: abc, acb, bac, bca, cab,
cba.
Permutazioni con ripetizioni [modifica]
In alcuni casi un insieme puo' contenere elementi che si ripetono. In questo caso alcune
permutazioni di tali elementi saranno uguali tra loro. Indicando con n1, n2 fino ad nn il numero di
volte che si ripetono rispettivamente gli elementi 1, 2 ed n, le permutazioni con ripetizione
divengono:

Questa è anche la formula completa per qualsiasi permutazione, anche senza ripetizioni di elementi,
in quanto se assumiamo 1, 2 ed n uguali ad 1 (cioè gli elementi si ripetono una sola volta),
otteniamo esattamente la formula delle permutazioni semplici, perchè sarebbe:

Dismutazioni [modifica]
Sono dette dismutazioni le permutazioni prive di punti fissi, con formula:

Disposizioni semplici (senza ripetizioni) [modifica]


Una disposizione semplice di lunghezza k di elementi di un insieme S di n oggetti, con k < n, è una
presentazione ordinata di k elementi di S nella quale non si possono avere ripetizioni di uno stesso
oggetto. Per avere il numero di queste configurazioni si considera che il primo componente di una
tale sequenza può essere scelto in n modi diversi, il secondo in (n - 1) e così via sino al k - esimo
che può essere scelto in (n - k + 1) modi diversi. Pertanto il numero di disposizioni semplici di
k oggetti estratti da un insieme di n oggetti è dato dal prodotto:

Ad esempio le disposizioni semplici di lunghezza 2 degli elementi dell'insieme {1,2,3,4,5} = 20: 12,
13, 14, 15, 21, 23, 24, 25, 31, 32, 34, 35, 41, 42, 43, 45, 51, 52, 53, 54.

Si osserva che le permutazioni sono casi particolari delle disposizioni semplici: le permutazioni di
un insieme di n oggetti sono le disposizioni semplici di tali oggetti di lunghezza n. In effetti per il
loro numero:
Disposizioni con ripetizioni [modifica]
Una presentazione ordinata di elementi di un insieme nella quale si possono avere ripetizioni di uno
stesso elemento si dice disposizione con ripetizioni. Cerchiamo il numero delle possibili sequenze
di k oggetti che riproducono gli elementi di un insieme di n oggetti ognuno dei quali può essere
preso più volte. Si hanno n possibilità per scegliere il primo componente, n per il secondo ed
altrettante per il terzo e così via sino al k - esimo che completa la configurazione. Il numero cercato
è pertanto:

Ad esempio le disposizioni con ripetizione di lunghezza 2 degli elementi di {1,2,3,4,5} sono 52 =


25: 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55.

Combinazioni semplici (senza ripetizioni) [modifica]


Si chiama combinazione semplice una presentazione di elementi di un insieme nella quale non ha
importanza l'ordine dei componenti e non si può ripetere lo stesso elemento più volte. La collezione
delle combinazioni di k elementi estratti da un insieme S di n oggetti distinti si può considerare
ottenuta dalla collezione delle disposizioni semplici di lunghezza k degli elementi di S ripartendo
tali sequenze nelle classi delle sequenze che presentano lo stesso sottoinsieme di S e scegliendo una
sola sequenza da ciascuna di queste classi. Si osserva che ciascuna delle suddette classi di sequenza
di lunghezza k contiene k! sequenze, in quanto accanto a una sequenza σ si hanno tutte e sole quelle
ottenibili permutando i componenti della σ. Quindi il numero delle combinazioni semplici di n
elementi di lunghezza k si ottiene dividendo per k! il numero delle disposizioni semplici di n
elementi di lunghezza k:

Di solito tra le diverse disposizioni semplici di una classe si sceglie come combinazione
rappresentativa la sequenza nella quale i componenti compaiono in ordine crescente (tutti gli
insiemi finiti possono avere gli elementi ordinati totalmente, ovvero associati biunivocamente ai
primi interi positivi).

Ad esempio le combinazioni semplici di lunghezza 4 degli elementi di {1,2,3,4,5,6} sono

: 1234, 1235, 1236, 1245, 1246, 1256, 1345, 1346, 1356, 1456, 2345, 2346, 2356,
2456, 3456.

Combinazioni con ripetizioni [modifica]


Quando l'ordine non è importante ma è possibile avere componenti ripetute si parla di
combinazioni con ripetizione. Nelle combinazioni con ripetizione di lunghezza k ogni elemento
può essere ripetuto fino a k volte. Pensiamo in particolare alle combinazioni con ripetizione di
lunghezza k dell'insieme dei primi n interi positivi e più precisamente alle sequenze non decrescenti
di lunghezza k di interi in {1,2,...,n}. Consideriamo una di queste sequenze e
associamole la sequenza . Si constata che la nuova sequenza è
strettamente crescente, non presenta ripetizioni e quindi individua una combinazione semplice di
lunghezza k degli interi in {1, 2, ..., n+k-1). La precedente associazione pone in corrispondenza
biunivoca le combinazioni con ripetizioni di lunghezza k degli elementi di {1, 2, ..., n} con le
combinazioni semplici di lunghezza k degli interi in {1, 2, ..., n+k-1). Quindi il numero delle
combinazioni con ripetizioni di lunghezza k dei primi n interi positivi coincide con il numero delle
combinazioni semplici di lunghezza k dei primi n+k-1 interi positivi:

Ad esempio le combinazioni con ripetizione di lunghezza 2 degli elementi di {1,2,3,4,5} sono

: 11, 12, 13, 14, 15, 22, 23, 24, 25, 33, 34, 35, 44, 45, 55.
Permutazioni

1 Introduzione
Una permutazione su un insieme di n elementi (di solito {1, 2, . . . , n }) è una funzione biiettiva
dall’insieme in sé. In parole povere, è una regola che a ogni elemento dell’insieme, detto
lettera, ne associa un altro (eventualmente l’elemento stesso) in maniera che a due lettere
diverse non venga mai associata la stessa lettera. Le permutazioni vengono descritte in forma
esplicita elencando su due righe le lettere (in ordine) e le lettere loro associate:
 
1234
(1)
3124
In questo caso, alla lettera 1 viene associato la lettera 3, alla lettera 2 la lettera 1 e così via.
Notate che la lettera 4 viene associata a se stessa. Le condizioni che abbiamo dato fanno sì
che la seconda riga debba contenere solo lettere distinte.
Un modo di pensare una permutazione è sotto forma di “spostamento”: essa indica come una
disposizione ordinata di oggetti deve essere spostata. Per esempio, se consideriamo la lista
cabd
possiamo applicarle la permutazione (1): il carattere di posto 1 andrà al terzo posto e così via.
La nuova lista risultante è
abcd
La permutazione (1) è quindi quella che ordina la lista data. Torneremo più avanti su questo
concetto.
Le permutazioni possono essere composte. Date due permutazioni sullo stesso numero di
lettere possiamo cioè eseguirle in sequenza. Il risultato è ancora una permutazione. Esiste una
permutazione che non sposta nulla:
 
1 2 3 ... n
1 2 3 ... n

1
essa è detta la permutazione identica, e può essere effettuata prima o dopo qualunque al-
tra permutazione senza alterare il risultato. Infine, data una permutazione ne esiste un’altra,
l’inversa, che esegue lo scambio “opposto”: per ottenere l’inversa di una permutazione basta
scambiare la prima e la seconda riga e riordinare la prima. Per esempio, per ottenere l’inversa
di (1) operiamo come segue:
     
1234 3124 1234
(2)
3124 1234 2314

È facile dimostrare che se componiamo (in qualunque ordine) una permutazione e la sua
inversa otteniamo la permutazione identica.

2 Cicli
Una rappresentazione importante e molto compatta di una permutazione è in forma di cicli.
Un ciclo è una lista di indici fra parentesi, e conveniamo che rappresenti la permutazione che
associa a ogni indice nel ciclo quello successivo. Ad esempio, il ciclo

(1235)

rappresenta la permutazione che manda 1 in 2, 2 in 3 e così via fino a 5 in 1. Due cicli sono
digiunti se non hanno lettere in comune. Per esempio, (123) e (45) sono disgiunti, ma (123)
e (124) no. Per scrivere la composizione di permutazioni rappresentate da cicli, basta scrivere
i cicli di seguito.
Non è difficile calcolare la permutazione risultante da una composizione di cicli: basta, per
ogni lettera, “seguire il suo destino” lungo i vari cicli. Per esempio,
 
12345
(123)(135)(24) = . (3)
45321
Come abbiamo fatto il conto? Cominciamo da 1: il primo ciclo manda 1 in 2, il secondo non
tocca il 2, il terzo manda 2 in 4: concludiamo che i tre cicli mandano 1 in 4. Il primo ciclo
manda 2 in 3, il secondo 3 in 5, e il terzo non tocca 5: concludiamo che i tre cicli mandano 2 in
cinque, e così via. Notate che alla fine del conto c’è un controllo di coerenza molto semplice:
tutti i numeri nella seconda riga devono essere distinti.
Un teorema molto importante sulle permutazioni dice quanto segue.

Teorema 1 Ogni permutazione si può scrivere come una composizione di cicli disgiunti in
modo unico a meno dell’ordine dei cicli stessi.

2
Come fare a ottenere una rappresentazione in cicli di una permutazione? Basta “seguire” una
lettera qualunque fino a trovare un ciclo: per esempio, in (1) abbiamo che 1 va in 3, 3 va in 2
e 2 va in 1; quindi il primo ciclo che troviamo è (123). A questo punto non ci rimane che 4,
che però va in sé, e formerebbe in ciclo di lunghezza 1. I cicli di lunghezza 1 per convenzione
non si scrivono, e quindi la permutazione (1) si scrive (123).
Vediamo un esempio un po’ più complicato:
 
12345
(125)(43)
25431

Anche la permutazione (3) ha una rappresentazione in cicli digiunti: (1425). È un buon


esercizio scrivere un programma che data una permutazione ne scrive la rappresentazione in
cicli.
Dato un ciclo di lunghezza n, è possibile spezzarlo in cicli più corti, incrementando la lun-
ghezza complessiva. Per esempio, (123) = (12)(13). In generale, se avete un ciclo della
forma (i 1 i 2 . . . i k ) potete sempre scriverlo come (i 1 i 2 . . . i j )(i 1 i j+1 i j+2 . . . i k ) (con j < k).
Questo processo può essere spinto fino a cicli di lunghezza due:

(i 1 i 2 . . . i k ) = (i 1 i 2 )(i 1 i 3 )(i 1 i 4 ) . . . (i 1 i k ).

3 Generazione di permutazioni casuali


La generazione di permutazioni casuali è importante per la generazione di input significativi.
Inoltre, a volte permutare a caso i dati in input può servire per ridurre la probabilità che una
cattiva configurazione dei dati faccia comportare male l’algoritmo (il caso tipico è la scelta dei
pivot nel Quicksort). La rappresentazione più immediata per una permutazione è un vettore il
cui i-esimo elemento contenga la lettera associata a i.
Per generare una permutazione su n elementi in tempo lineare si può usare il seguente codice
C:

for(i=0; i<n; i++) p[i] = i;


for(i=n-1; i>0; i--)
swapint(&p[i], &p[(int)((rand()/(1.0+RAND_MAX))*(i+1))]);

o il seguente codice Pascal:

FOR i:=1 TO n DO p[i] := i;


FOR i:=n DOWNTO 2 DO swapint(p[i], p[rand(i+1)]);

3
Abbiamo assunto che p sia un vettore di lunghezza n, e che la funzione swapint scambi il
contenuto delle variabili che le sono passate.
Come funziona il codice? Descriviamo il comportamento del codice Pascal. Quello del codice
C è simile, modulo il fatto che gli indici cominciano da zero e che dobbiamo fare un po’ più
di lavoro per ottenere un intero casuale ben distribuito.
In prima istanza, il vettore p contiene

1 2 3 4 ... n

A questo punto scandiamo il vettore da destra verso sinistra con l’indice i. Ogni volta cerchia-
mo un intero k compreso tra 1 e i (inclusi), e scambiamo il contenuto dell’k-esimo elemento
del vettore con l’i-esimo. Qual è l’effetto?
In pratica stiamo costruendo la permutazione decidendo quale lettera associare a n, quindi
quale lettera associare a n − 1 e così via. A ogni passo, a sinistra dell’elemento di posizione
i ci sono tutte le lettere che non abbiamo ancora scelto, e tra queste scegliamo chi associare
alla lettera i. Al primo passo scegliamo uniformemente tra gli interi da 1 a n l’immagine di n.
Quando scambiamo i due elementi, lasciamo nel posto n l’output corretto (l’immagine di n)
e al tempo stesso lasciamo a sinistra di n le lettere che possono ancora essere scelti per essere
associati a n − 1, e così via.
Per esempio, fissiamo n = 6 e supponiamo di scambiare l’elemento di posto 6 con quello
(scelto a caso) di posto 2. Il risultato sarebbe

1 6 3 4 5 2

A questo punto abbiamo scelto la lettera da associare a 6, e cioè 2. Al passo successivo,


scegliamo a caso tra i cinque elementi più a sinistra la lettera da associare alla lettera 5,
diciamo il primo:
5 6 3 4 1 2
Notate che i primi quattro elementi contengono (in modo disordinato, ma non importa perché
tanto li scegliamo a caso) le lettere che possiamo associare a 4. Se, per esempio, scegliamo la
seconda, arriviamo a
5 4 3 6 1 2
E così via. Alla fine dell’algoritmo abbiamo scelto una permutazione in modo uniforme e
indipendente.

4
4 Come ricavare permutazioni da ordinamenti
A volte è utile ricavare da un vettore non ordinato v la permutazione che, applicata al vettore
stesso, lo ordinerebbe. Per ottenere questo risultato basta applicare un qualunque algoritmo
di ordinamento a un vettore fittizio p riempito inizialmente con gli indici 0, 1,. . . , n − 1 (o 1,
2, . . . , n se volete partire da 1). L’algoritmo di ordinamento viene a questo punto applicato al
vettore p, ma i confronti tra l’elemento di posto i e quello di posto j non vengono effettuati
confrontando p[i] e p[j], ma piuttosto v[p[i]] e v[p[j]]. In questo modo, alla
fine dell’algoritmo avremo un vettore che rappresenta la permutazione inversa di quella che
ordinerebbe v: infatti, p[i] conterrà l’indice dell’elemento che finirebbe al posto i dopo
l’ordinamento. Per ottenere la permutazione inversa di una data basta un ciclo—in C,

for(i=0; i<n; i++) q[p[i]] = i;

e in Pascal

FOR i:=1 TO n DO q[p[i]] := i;

dove p e q sono vettori di interi di lunghezza n, e q, alla fine del ciclo, contiene l’inverso della
permutazione rappresentata da p.

Potrebbero piacerti anche