Permutazioni, un algoritmo semplice

Monday, 14 May 07
Permutazioni in una rappresentazione artistica di Victor Vasarely A quanto pare nei colloqui alcune aziende chiedono ai candidati di scrivere o quanto meno di esporre il funzionamento di diversi algoritmi. Una domanda che sembra abbastanza in voga e' la seguente:

Dati N elementi scrivere un programma o descrivere un algoritmo che produce tutte le N fattoriale permutazioni

Ad esempio le permutazioni di 'abc' sono le seguenti 6:
abc acb cab bac bca cba
Qualche tempo fa mi serviva per una questione pratica calcolare tutte le permutazioni di una stringa. Dovevo risolvere un problema reale, ma un utilizzo ludico e' sicuramente quello di trovare gli anagrammi di una parola se proprio vi serve uno stimolo ;)

Prima di guardare la letteratura relativa ad un algoritmo su google o in un libro di algoritmi ho l'abitudine di cercare di costruirlo da solo, tanto per tenermi in esercizio, cosi' ho trovato una soluzione semplice che e' facile da ricordare. Sicuramente e' trattata in letteratura da qualche parte ma non so dove e non conosco il nome di questo algoritmo (come potete leggere piu' sotto durante la ricerca di link di approfondimento per questo articolo ho trovato l'algoritmo che sto per illustrare in un sito).

Immaginiamo di voler permutare gli elementi 'abcd'

Pendiamo il primo elemento, 'a'. Le permutazioni di un singolo elemento sono lo stesso elemento, dunque scriviamo
a
Ora prendiamo l'elemento successivo, 'b', e lo inseriamo in tutte le posizioni possibili (ovvero solo prima di 'a' e dopo 'a') per ogni permutazione di 'a', che e' una sola, dunque:
(b)a
a(b)
E queste sono le permutazioni di 'ab'. Ora prendiamo 'c', e per ogni permutazione di 'ab' inseriamo 'c' in ogni possibile posizione:
(c)ba
b(c)a
ba(c)

(c)ab a(c)b ab(c)
E cosi' via con la 'd' che inseriremo in ogni posizione possibile di ogni permutazione di 'abc'.

Trasformare questo algoritmo in codice e' banale, tuttavia anche se questo algoritmo e' cosi' semplice non e' molto efficiente. C'e' un algoritmo che sfrutta l'ordine lessicografico degli elementi, ovvero il fatto che per quanto riguarda le stringhe sappiamo dire quale carattere e' maggiore dell'altro (B e' maggiore di A e cosi' via). Tramite questo algoritmo data una qualunque permutazione di una stringa e' possibile calcolare la successiva.

Ovviamente questo puo' essere molto utile perche' permette di creare un oggetto che puo' essere invocato all'interno di un ciclo per restituire la prossima permutazione ogni qual volta la si vuole utilizzare senza generare tutte le permutazioni possibili all'inizio. La descrizione di questo algoritmo e' contenuta in maniera chiara nel secondo link di approfondiemnto. Buon divertimento con permutazioni e anagrammi, per chi volesse cimentarsi :)

p.s. nel secondo link di approfondimenti ho trovato esattamente l'algoritmo da me descritto, che infatti viene considerato come uno dei metodi piu' semplici e naturali di pensare alle permutazioni

Per approfondire

21666 views*
Posted at 09:47:53 | permalink | 4 comments | print