Questa repository privata contiene tutti gli eseguibili, gli appunti, i test, le relazioni per il progetto di algoritmi e strutture dati
Tre date:
- 16 giugno 2025.
- 6 luglio 2025.
- 1 settembre 2025.
Una parola è un'insieme di caratteri e ogni parola è composta da caratteri dell'alfabeto inglese minuscolo.
Per ogni parola
- Inserzione: la possibilità di inserire lettere in qualunque posizione di una qualunque parola.
-
Cancellazione: la possibilità di cancellare un qualsiasi carattere da
$x$ . -
Sostituzione: la possibilità di sostituire un qualsiasi carattere di
$x$ . -
Scambio: la possibilità di scambiare due caratteri adiacenti di
$x$ .
Ogni parola
Una catena tra due parole
Un gruppo è l'insieme massimale di parole, contenute nel dizionario, tali per cui si può trasformare una parola in un'altra con una catena di parole tutte interne al gruppo.
Uno schema è una sequenza finita di caratteri che appartengono all'alfabeto delle lettere inglesi minuscole e maiuscole e che hanno necessariamente almeno una lettera maiuscola.
Un'assegnazione è una funzione
Una parola
Due schemi sono compatibili se esiste almeno una parola che è compatibile con entrambi.
Le operazioni, che non devono necessariamente essere funzioni, da implementare nel progetto sono le seguenti:
crea(): Crea un nuovo dizionario inizializzando, se presente, quello già esistente.carica(*os.File): Inserisce le parole e gli schemi separati da spaziature, tabulazioni o a capo presenti nel file, di testo, passato come argomento. Se il file non esiste o non è di tipo testo, allora non viene eseguita nessuna operazione.stampa_parole(): stampa tutte le parole del dizionario.stampa_schemi(): stampa tutti gli schemi del dizionario.inserisci(w string): Inserisce all'interno del dizionario lo schema o la parolaw.elimina(w string): Rimuovi la parola o lo schemawdal dizionario.ricerca(S string): ricerca dello specifico schema.
Per la struttura dati dizionario si può usare una struttura formata da due mappe, una contente gli schemi e l'altra contenente le parole. Come chiave si può utilizzare la stringa effettiva dello schemo che come valore utilizza tutte le parole compatibili.
In poche parole la struttura dizionario è formata in questo modo:
schemi[string]struct{}: Mappa da schema a struct vuota. Questa scelta è fatta per far sì che la mappa sia complessivamente più leggera e comunque mantenga la sua proprietà di fornire istantaneamente il risultato.parole[string]struct{}: contiene tutte le parole del dizionario. Le motivazioni della scelta della mappa sono analoghe a quelle fornite prima.
Per la distanza è stata implementata una funzione che calcola la distanza di Demerau-Levhstain fra due stringhe. Ho preso lo pseudo codice del prof Pighizzini per la teoria della programmazione dinamica, poi ho integrato con lo pseudo codice preso da wikipedia nella pagina dedicata alla distanza di Demerau-Levhstain, visto che a quanto pare a lezione abbiamo studiato l'algoritmo di Levhstain (ma senza l'operazione di swap).
Per la ricerca si intende procedere in questo modo:
Suggerimento di Claude.
Per la ricerca si controllano tutte le parole compatibili con lo schema. Non vengono salvate le informazioni trovate ma vengono stampate direttamente. La scelta deriva dall'opzione scartata di salvare le parola compatibili con un determinato schema, dato che tanto non è plausibile cercare più volte la compatibilità.
In pratica si cercano parole con la stessa lunghezza dello schema e si controlla se individuano le possibili sostituzioni fatte da map[rune]rune.
La funzione catena è stata implementata mediante una BFS che cerca la catena più corta per arrivare ad una determinata parola partendo da un'altra parola del dizionario.
Ho implementato una struttura dati, su suggerimento di claude, che contiene il percorso per arrivare alla parola trovata fino ad ora, il numero di passi per arrivare a quella parola e la parola stessa.
La struttura dati si chiama nodoPila. Questa struttura dati viene inserita all'interno di una struttura dati list, fornita dal package container/list. Il package container list implementa senza problemi, e in maniera ottimizzata, una lista doppiamente concatenata.