Permutazioni, un algoritmo semplice
Monday, 14 May 07
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:
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
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
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 cbaQualche 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
aOra 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)E cosi' via con la 'd' che inseriremo in ogni posizione possibile di ogni permutazione di 'abc'.
(c)ab a(c)b ab(c)
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
Do you like this article?
Subscribe to the RSS feed of this blog or use the newsletter service in order to receive a notification every time there is something of new to read here.
Note: you'll not see this box again if you are a usual reader.
Subscribe to the RSS feed of this blog or use the newsletter service in order to receive a notification every time there is something of new to read here.
Note: you'll not see this box again if you are a usual reader.
Comments
1
16 Mar 08, 18:15:29
ma si cretinu?Mi l'ha diri tu stu algoritmo... ma...!chi parrammu che surdi.
14 Jan 09, 09:27:29
12 Apr 10, 19:04:47
L'algoritmo di Johnson-Trotter non è lessicografico
http://thedarshan.wordpress.com/2010/02/18/algorit...
http://thedarshan.wordpress.com/2010/02/18/algorit...
08 Apr 11, 03:03:01
Non sono permutazioni ma combinazioni.
Il problema delle prmutazioni é piú difficile.
Il problema delle prmutazioni é piú difficile.