Trovare la permutazione successiva. Formule combinatorie

Una permutazione è una combinazione di elementi da n diversi elementi presi in un certo ordine. In una permutazione, l'ordine degli elementi è importante e tutti gli elementi devono essere coinvolti nella permutazione. n elementi.

Compito: trova tutte le possibili permutazioni per la sequenza di numeri 1, 2, 3.
Ci sono le seguenti permutazioni:

1: 1 2 3
2: 1 3 2
3: 2 1 3
4: 2 3 1
5: 3 1 2
6: 3 2 1

Permutazioni senza ripetizione

Il numero di permutazioni per N elementi differenti è N!. Veramente:

  • uno qualsiasi dei n elementi (opzioni totali n),
  • nessuno dei rimanenti (N-1) elementi (opzioni totali N (N-1)),
  • se continuiamo questa sequenza per tutti n luoghi, otteniamo: N (N-1) (N-2) ... ... 1, questo è tutto N! permutazioni.

Consideriamo il problema di ottenere tutte le permutazioni dei numeri 1…N(cioè sequenze di lunghezza n), dove ciascuno dei numeri ricorre esattamente 1 volta. Ci sono molte opzioni per l'ordine in cui si ottengono le permutazioni. Tuttavia, il problema più frequentemente risolto è la generazione di permutazioni in lessicografico ordine (vedi esempio sopra). In questo caso, tutte le permutazioni vengono ordinate prima in base al primo numero, poi in base al secondo e così via. in ordine crescente. Quindi la prima permutazione sarà 1 2 … N, e l'ultimo N N-1 … 1.

Considera un algoritmo per risolvere il problema. Viene data la sequenza iniziale di numeri. Per ottenere ogni successiva permutazione, è necessario eseguire i seguenti passaggi:

  • È necessario scansionare la permutazione corrente da destra a sinistra e allo stesso tempo assicurarsi che ogni elemento successivo della permutazione (un elemento con un numero maggiore) non sia più del precedente (un elemento con un numero inferiore). Non appena questo rapporto viene violato, è necessario fermarsi e contrassegnare il numero corrente (posizione 1).
  • Ancora una volta, guarda il percorso percorso da destra a sinistra fino a raggiungere il primo numero, che è maggiore di quello segnato nel passaggio precedente.
  • Scambia due elementi ricevuti.
  • Ora nella parte dell'array, che si trova a destra della posizione 1, è necessario ordinare tutti i numeri in ordine crescente. Poiché prima erano già scritti tutti in ordine decrescente, è necessario capovolgere semplicemente questa parte della sottosequenza.

Pertanto, otterremo una nuova sequenza, che sarà considerata come quella iniziale nel passaggio successivo.

Implementazione in C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

#includere
usando lo spazio dei nomi std;

{
int s = a[i];
a[i] = a[j];
a[j] = s;
}
bool NextSet(int *a, int n)
{
int j = n - 2;
mentre (j != -1 && a[j] >= a) j--;
se (j == -1)
restituire falso; // niente più permutazioni
int k = n - 1;
mentre (a[j] >= a[k]) k--;
scambia(a, j, k);
int l = j + 1, r = n - 1;
mentre (l swap(a, l++, r--);
restituisce vero;
}
void Stampa(int *a, int n) // permutazione dell'output
{
statico int num = 1; // numero di permutazione
larghezza taglio(3);
cout<< num++ << ": " ;
per (int i = 0; i< n; i++)
cout<< a[i] << " " ;
cout<< endl;
}
int principale()
{
intn, *a;
cout<< "N = " ;
cin >> n;
a = nuovo int[n];
per (int i = 0; i< n; i++)
a[i] = io + 1;
Stampa(a, n);
mentre (NextSet(a, n))
Stampa(a, n);
cin.get(); cin.get();
restituire 0;
}

Risultato dell'esecuzione

Permutazioni con ripetizioni

Il problema della generazione di permutazioni merita un'attenzione particolare. n elementi se gli elementi della sequenza possono essere ripetuti. Supponiamo che la sequenza originale sia composta da elementi n 1 , n 2 ... n k, dove l'elemento n 1 si ripete r1 una volta, n 2 si ripete r2 volte, ecc. in cui n 1 + n 2 +...+n k =N. Se contiamo tutto n 1 +n 2 +...+n k elementi di una permutazione con diverse ripetizioni, quindi un totale di diverse varianti di permutazioni ( n 1 +n 2 +...+n k)!. Tuttavia, tra queste permutazioni, non tutte sono diverse. Anzi, tutto r1 elementi n 1 possiamo riorganizzarci tra loro, e questo non cambia la permutazione. Allo stesso modo, possiamo riordinare gli elementi n 2, n 3 ecc. Di conseguenza, abbiamo r1! varianti di scrittura la stessa permutazione con una diversa disposizione di elementi ripetuti n 1. Pertanto, qualsiasi permutazione può essere scritta r 1 !r 2 !... rk ! modi. Pertanto, il numero di diverse permutazioni con ripetizioni è

Per generare permutazioni con ripetizioni, puoi utilizzare l'algoritmo per generare permutazioni senza ripetizioni indicato sopra. Introduciamo un elemento ripetuto nell'array a. Di seguito è riportato il codice del programma per la generazione di permutazioni con ripetizioni (è stato modificato solo il codice della funzione main()).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

#includere
usando lo spazio dei nomi std;
void swap(int *a, int i, int j)
{
int s = a[i];
a[i] = a[j];
a[j] = s;
}
bool NextSet(int *a, int n)
{
int j = n - 2;
mentre (j != -1 && a[j] >= a) j--;
se (j == -1)
restituire falso; // niente più permutazioni
int k = n - 1;
mentre (a[j] >= a[k]) k--;
scambia(a, j, k);
int l = j + 1, r = n - 1; // ordina il resto della sequenza
mentre (l swap(a, l++, r--);
restituisce vero;
}
void Stampa(int *a, int n) // permutazione dell'output
{
statico int num = 1; // numero di permutazione
larghezza taglio(3); // Larghezza del campo di output del numero di permutazione
cout<< num++ << ": " ;
per (int i = 0; i< n; i++)
cout<< a[i] << " " ;
cout<< endl;
}
int principale()
{
intn, *a;
cout<< "N = " ;
cin >> n;
a = nuovo int[n];
per (int i = 0; i< n; i++)
a[i] = io + 1;
a = 1; // elemento ripetuto
Stampa(a, n);
mentre (NextSet(a, n))
Stampa(a, n);
cin.get(); cin.get();
restituire 0;
}

L'output dell'algoritmo di cui sopra è:

Scrivere una permutazione  come prodotto di cicli indipendenti

rende facile trovare l'ordine della permutazione

.

Teorema 2. Ordine
permutazioni

(ordine del sottogruppo ciclico
)è uguale a minimo comune multiplo(LCM) delle lunghezze dei cicli indipendenti inclusi nella scomposizione di .

Prova. Immagina una permutazione
come prodotto di cicli indipendenti

. (7)

Dal momento che i cicli
indipendenti (agiscono su insiemi diversi
), e se q è l'ordine di un sottogruppo ciclico,

,

,

dove
.

Pertanto, q è un multiplo comune degli ordini di cicli  k che coincidono con le loro lunghezze .

Se q è il più piccolo numero positivo per cui

,poi

Teorema fondamentale dell'aritmetica. Ogni intero positivo n diverso da uno può essere scritto come prodotto di numeri primi

. (9)

Questa notazione è unica fino all'ordine dei fattori.

Sostituendo i prodotti dei numeri primi coincidenti in (9) con le loro potenze, otteniamo

dove

Molti numeri primi

Esempio. Due numeri interi qualsiasi m e n possono essere scritti come prodotti degli stessi numeri primi


,

Esempio. Determina l'ordine della permutazione
tipo

Soluzione. Rappresentiamo la permutazione  come prodotto di cicli indipendenti, cioè

Lunghezze di cicli indipendenti
pari

Pertanto, l'ordine della permutazione considerata è uguale a 28.

Decomposizione di una permutazione in un prodotto di trasposizioni.

Definizione. Un ciclo di lunghezza due è detto trasposizione. Qualsiasi trasposizione ha la forma
e lascia tutti i personaggi al loro posto tranne
.

Teorema. Ogni permutazione
può essere rappresentato come il prodotto di una trasposizione.

Prova. Il teorema sarà dimostrato se possiamo rappresentare ciascuno dei cicli  k inclusi nelle espansioni della permutazione come prodotti di trasposizioni:
.

Considera un ciclo arbitrario , Per esempio
e scomporlo in un prodotto di trasposizioni.

Algoritmo di scomposizione del ciclo
nel prodotto delle trasposizioni è mostrato in Figura 2.

Ciclo
trasposizioni

Fig 2.– Decomposizione del ciclo
in un prodotto di trasposizioni.

Dopo il completamento di tutte le operazioni al posto di ogni elemento del ciclo l'elemento successivo è stato trovato e il primo elemento è stato spostato nell'ultimo posto. Così il ciclo si è rivelato scomposto in un prodotto di trasposizioni:

Naturalmente, questa scomposizione non è unica. Per esempio

Un'altra cosa è importante - e nella prima e nella seconda scomposizione c'è un numero uguale di trasposizioni - quattro. Se
, allora il numero di trasposizioni è
. Espandendo allo stesso modo ogni ciclo
permutazioni nel prodotto della trasposizione otteniamo l'espansione dell'intera permutazione in un prodotto di trasposizioni.

Commento. Numero di trasposizioni in un ciclo
forse più di quattro! Prendi una trasposizione arbitraria dalla scomposizione di questo ciclo, ad esempio,
. Poi il prodotto
coincide con la permutazione dell'identità e il ciclo
può essere rappresentato come

È facile vedere che in tutti questi casi il numero di trasposizioni è pari ed è uguale a 4, 6, 8. È chiaro che il metodo che "allunga" la scomposizione non cambia la parità della scomposizione originaria.

Teorema. Sia  una permutazione di , ma

. (9)

qualche espansione di  nel prodotto delle trasposizioni.

Poi il numero

(10)

è chiamata parità (firma o segno) della permutazione  ed è completamente determinata da , cioè non dipende da come la permutazione  viene scomposta in un prodotto di trasposizioni. Inoltre, se
, poi

. (11)

Definizione. permutazione
si chiama anche se
, e dispari se
.

La definizione di una permutazione pari implica che tutte le trasposizioni sono permutazioni dispari.

Infatti, se è una trasposizione, quindi
, poi

Conseguenza 1. Tutte le permutazioni pari di grado n formano un sottogruppo
ordine
(si chiama gruppo alternato di grado n).

Conseguenza 2. Lascia permutazione
scomposto in un prodotto di cicli indipendenti

,

dove
,
, …,
, …,
sono le lunghezze di cicli indipendenti.

. (12)

Prova. Infatti, per il teorema precedente, abbiamo

.

Oltretutto,
perché tutti il ciclo è scritto come un prodotto
trasposizioni, quindi

Condividere