+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [Access] Anagrammi

  1. #1
    L'avatar di fragger
    fragger non è in linea Scolaretto
    Luogo
    Roma
    Post
    244

    [Access] Anagrammi

    La ricerca degli anagrammi di una parola si riconduce alla ricerca di tutte le possibili permutazioni delle lettere di quella parola.
    Se le lettere di una parola sono 8, si ha 8! (fattoriale di 8) = 1*2*3*4*5*6*7*8 = 40.320 combinazioni.
    Il fattoriale cresce molto in fretta, come è facile verificare che con 11! = 3.592.512.000
    E' impensabile che un computer, anche molto veloce, elabori una simile quantità di combinazioni e per ogni combinazione, cercare nel dizionario l'eventuale parola.

    Negli anni 70-80 trasmettevano in TV un programma, Paroliamo, in cui si estraevano delle lettere ed occorreva, con tali lettere, trovare quelle parole componibili più lunghe; il computer, non certo veloce come quelli di oggi, le trovava in un batter d'occhio. Come mai?

    Si usava un trucco che aggirava il problema degli anagrammi.
    In sostanza il computer cercava i vocaboli di senso compiuto e di diversa lunghezza, raggruppando le lettere estratte.

    Vediamo come si può ottenere dei risultati in modo velocissimo ed istantaneo.
    Si parte da una Tabella (Vocaboli) formata da 2 colonne, di cui una contiene i vocaboli, mentre l'altra contiene una serie di stringhe di caratteri (chiave), ottenute riordinando alfabeticamente le lettere di ogni vocabolo della prima colonna.
    Successivamente si copiano tutte le righe in una seconda Tabella (Chiavi) scartando quelle chiavi che risultano essere uniche, in quanto quella parola non avrà anagrammi.
    es:
    I seguenti vocaboli produrranno le rispettive chiavi:

    --- Vocaboli -------- Chiavi ---
    AMARICANTE --> AAACEIMNRT
    ANTEMARCIA --> AAACEIMNRT
    ANTICAMERA --> AAACEIMNRT
    MARANTACEI --> AAACEIMNRT


    Come vedete le chiavi sono esattamente uguali. Quindi se si digitano le seguenti lettere: TMNRIEACAA o semplicemente AMARICANTE, si crea una stringa in ordine alfabetico e si ricerca nella tabella Chiavi, alla colonna Chiavi, la stringa o le stringhe uguali e si estraggono di conseguenza i rispettivi Vocaboli.
    Con questo 'trucco' abbiamo eliminato il lento algoritmo delle combinazioni a favore di una velocissima ricerca di stringhe.

    Il DB in access che allego, contiene una maschera demo ed una tabella di circa 135.000 vocaboli, che ho estrapolato da una mia applicazione.
    Tale Tabella è frutto di un lavoro certosino, recuperando i vocaboli da un dizionario su CD. Prossimamente pubblicherò un programma in VB6 sempre per anagrammi che sfrutta lo stesso principio, con alcune implementazioni in più.

    Saluti Fragger

    Il DB allegato
    Anagrammi.mdb
    L'esperienza è la somma degli errori!.

  2. #2
    L'avatar di dragone bianco
    dragone bianco non è in linea Moderatore Globale
    Luogo
    Aosta
    Post
    7,734
    Ciao
    Mi piace questo Snippet

    Alcuni suggerimenti in merito

    Nel tuo codice quando cerchi gli anagrammi io semplificherei il codice usando una query
    dalla tua parola crei la chiave di essa
    Es
    AMARICANTE -> Chiave: AAACEIMNRT

    ora non ti resta che fare una query SQL che filtrala colonna CHIAVE con la chiave appena trovata (AAACEIMNRT ) e che la colonna PArola sia deversa da quella digitata (AMARICANTE )

    questa query SQL puoi scriverla direttamente nel RowSource della listbox

    Leggendo un po' il tuo codice noto che usi molte SUB in certi casi avrei usato delle Function e sopratutto avrei utilizzato la possibilità di passare parametri alla SUB e o Function in questo modo:

    ES
    codice:
    Sub Prova(Messaggio as string)
    
    End Sub
    
    Function Prova(Messaggio as string)as string
    
    End Sub
    Ciao

  3. #3
    L'avatar di fragger
    fragger non è in linea Scolaretto
    Luogo
    Roma
    Post
    244
    Grazie dei consigli
    Ho usato la query come hai detto modificando totalmente l'evento Click del pulsante come riportato sotto
    codice:
    Private Sub CercaAnagrammi_Click() 
      Dim StrSQL As String
      
      If IsNull(Me.Parola) Then Exit Sub
      StrSQL = "SELECT Chiavi.Parola FROM Chiavi WHERE Chiavi.Chiave = '" & OrdinaParola() & "' AND Chiavi.Parola <> '" & Trim(Me.Parola) & "';"
      Me.Lista.RowSource = StrSQL
    End Sub
    OrdinaParola() è la Function esistente nel codice.
    Ovviamente funziona anche se la query la scrivo direttamente nella proprietà della lista.

    Con questa modifica comunque non si ha un grosso vantaggio in termine di velocità in quanto stiamo lavorando con circa 31.000 chiavi.
    Saluti fragger

    PS:
    Mi sono anche accorto che nella Sub CercaAnagrammi_Click() c'è anche un errore di apertura di tabella:
    Apro la tabella Vocaboli invece di Chiavi......ma ora è tutto superato!
    L'esperienza è la somma degli errori!.

  4. #4
    L'avatar di dragone bianco
    dragone bianco non è in linea Moderatore Globale
    Luogo
    Aosta
    Post
    7,734
    è più fluido come codice e demandi il lavoro alla query integrata alla listbox e non ti serve la tabella "ordina"

    una domanda perché 2 tabelle "vocaboli e "Chiavi"
    che differenza c'è?

    Ciao

  5. #5
    L'avatar di fragger
    fragger non è in linea Scolaretto
    Luogo
    Roma
    Post
    244
    Sono d'accordo che si deve cercare sempre di ottimizzare il codice ed in certi casi risulta anche più leggibile nel tempo. Considera che questo l'ho scritto 5 - 6 anni fà e di SQL ne sapevo poco e lo usavo pochissimo.

    -In pratica per trovare gli anagrammi serve solo la tabella Chiavi.
    -La tabella vocaboli serve solo per generare le chiavi.
    In questa tabella si possono aggiungere nuovi vocaboli ma poi si deve rigenerare le chiavi come fa il demo.

    -La tabella Ordina è stata una mia elucubrazione mentale dell'epoca.
    A fronte di queste tue osservazioni l'ho sostituita con una routine di ordinamento Shell-Metzner ma va bene qualsiasi ordinamento, Bouble, Ripple ecc.. in quanto stiamo lavorando su un vettore con al massimo 24 elementi, ovvero le parole più lunghe (PSICONEUROENDOCRINOLOGIA, AUTOBLINDOMITRAGLIATRICE), non sò se c'è ne sono altre e sicuramente non sono anagrammabili.

    Se l'argomento ti interessa o può interessare alla comunity, ho un programma sempre in access, scritto nel lontano 1992 quindi in Access97, ma convertito in 2000-2003 dove ci sono molte cose interessanti e non solo anagrammi. Purtroppo non sono presenti istruzioni SQL ma basato solo su permutazioni e disposizioni semplici di N oggetti presi a gruppi di K, il codice non è un granchè ma fa il suo lavoro(lentamente).
    Un'anteprima

    [IMG]https://mega.co.nz/#!EdUG3A5J!wJYWso...fknQZCqJCQxkPw[/IMG]

    Ho aggiornato il link di Anagrammi Anagrammi.mdb

    Saluti
    PS:
    Non riesco a far vedere l'anteprima, direttamente nel post
    Ultima modifica di fragger; 27-01-2014 11:10 
    L'esperienza è la somma degli errori!.

  6. #6
    L'avatar di dragone bianco
    dragone bianco non è in linea Moderatore Globale
    Luogo
    Aosta
    Post
    7,734
    dall'immagine vedo che il programma ricalca il "paroliamo"
    Dati N lettere trova tutte le parole di senso compiuto con le varie lettere (parte di esse o tutte)
    Forse nelle regole del paroliamo erano inclusi plurali e femminili
    [Hot]Di quella trasmissione preferivo il gioco coi Numeri (o mi confondo con la versione francese o svizzera che aveva tutte e due)[/hot]

    Ciao

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi