Tabella di Hash per indicizzazione dizionario - How To in C

Pubblicità
Io non capisco dove sia la pesantezza della mia soluzione: mi esprimo meglio.
Faccio all'inizio un controllo sulla scacchiera: ci sono 16 posti, nel worst case ho 16 lettere differenti-->posso già escludere 10/26 di dizionario dato che non vado neanche a cercare le parole che iniziano con lettere non contenute in scacchiera.
Per il resto scorro il dizionario (senza salvarlo da nessuna parte) e, quando sono in presenza di una parola che inizia con una delle 16 lettere presenti in tabella, chiamo la funzione ricorsiva che non sarà una brute force. Ci saranno dei controlli step to step che la renderanno enormemente più efficiente di una brute force.
Es: cerco CASA. Chiamo la funzione cerca sulla prima casella: è C? No. Bene vado avanti senza cercare alcun chè. Trovo una C in un'altra casella: ho una A in posizione adiacente? No-->non cerco neanche / Si--> mi sposto sulla casella dove c'è la A e controllo se c'è una S. Se non c'è termino la ricerca. Non andrò a fare una brute force che ogni volta calcola tutti i possibili percorsi in scacchiera.
Facendo in questo modo la memoria occupata è trascurabile rispetto ai 15MB circa che ci andrebbero per l'albero (non userei nemmeno 500KB), eviterei molte operazioni (e quindi tempo) legate alla creazione dell'alberlo ed all'allocazione della memoria ad esso destinata e farei poche ricerche, solo quelle necessarie, che dovrei fare comunque sia anche se avessi un albero.
Mi spiegheresti gentilmente perchè credi che questa soluzione (che mantiene tempi accettabili, considerando anche il tempo che ci vorrebbe a creare l'albero, e consumando quasi zero memoria) non sia competitiva?
Grazie in anticipo
Spetta un attimo... ma tu questo procedimento lo faresti per ogni parola nel dizionario e per ognuna delle 16 celle?
Non capisco... nell'esempio di "casa", se arrivi a verificare "cas" ma al quarto posto non trovi una "a" ma una "o", annulli tutto o consideri valido "caso" (con la "o")?
Mi pare comunque un approccio lentino. Oltre al fatto che se non vuoi caricarti il dizionario in memoria, devi accedere al file continuamente...
 
Ma l'hai capito che l'albero lo generi una volta e poi salvi su file?
:)
Gli unici file pre-salvati che posso consegnare insieme all'eseguibile sono le scacchiere iniziali sulle quali far girare il programma ed un dizionario standard di italiano.
Non posso aggiungere altri file al progetto, come ad esempio un albero. Dovrei crearlo ed allocarlo al momento in ram.
Inoltre deve essere possibile caricare un diverso dizionario.

- - - Updated - - -

Spetta un attimo... ma tu questo procedimento lo faresti per ogni parola nel dizionario e per ognuna delle 16 celle?
Non capisco... nell'esempio di "casa", se arrivi a verificare "cas" ma al quarto posto non trovi una "a" ma una "o", annulli tutto o consideri valido "caso" (con la "o")?
Mi pare comunque un approccio lentino. Oltre al fatto che se non vuoi caricarti il dizionario in memoria, devi accedere al file continuamente...

Lo farei per le parole del dizionario che iniziano per una lettera tra le 16 che ho in scacchiera (basta fare una semplice if una volta che ho salvato le 16 lettere in scacchiera).
Se arrivo a CAS e non trovo una A adiacente ritorno a CA, e vedo se c'è una S adiacente che porti ad un diverso percorso. Se non la trovo torno a C per vedere se ho un'altra A adiacente diversa da quella scelta inizialmente.
Considerando che di solito al più ho 2 casi per formare una parola, facendo dei check ad ogni passo le ricerche sarebbero poche, la maggior parte cesserebbero dopo 0-1 passo.
Comunque sia anche utilizzando un albero dovrei fare ricerche simili. Sarebbero di meno ma pagherei il tempo recuperato col tempo di creazione dell'albero e con la memoria allocata che sarebbe molta di più.
Accedere ad un file per scorrerlo, comunque, non dovrebbe rappresentare un problema.
 
Ok potrei anche memorizzarlo in un vettore di stringhe, non è un problema insormontabile.
Piuttosto mi aspettavo qualche considerazione sull'algoritmo considerato che non posso usare strutture già create.
 
Ok ma lento non significa nulla. Tutto è relativo in quanto devo cercare di andare il più veloce possibile, col minor utilizzo di memoria possibile, rispettando però quelle che sono le consegne. Non potendo partire da una struttura più complessa del semplice dizionario standard, credete ci siano metodi migliori di soluzione?
 
Sì, un albero di ricerca, ed è la n-esima volta che te lo si dice. Altrimenti calcola il costo del tuo algoritmo, dimostra che è più veloce e posta i conti. Quelli degli alberi sono invece di pubblico dominio.

Se vuoi fare di testa tua vai a stressare chi è pagato per farlo! [cit. mr.frizz]

- - - Updated - - -

E ti dico di più, vieni a chiedere aiuto, e poi pretendi che si faccia come dici tu senza nemmeno conoscere realmente né aver provato ad applicare quello che ti si è detto. Io me ne tiro fuori! Ciao. :)
 
Sì, un albero di ricerca, ed è la n-esima volta che te lo si dice. Altrimenti calcola il costo del tuo algoritmo, dimostra che è più veloce e posta i conti. Quelli degli alberi sono invece di pubblico dominio.

Se vuoi fare di testa tua vai a stressare chi è pagato per farlo! [cit. mr.frizz]

- - - Updated - - -

E ti dico di più, vieni a chiedere aiuto, e poi pretendi che si faccia come dici tu senza nemmeno conoscere realmente né aver provato ad applicare quello che ti si è detto. Io me ne tiro fuori! Ciao. :)

Io cerco solo di confrontare le mie idee con quelle altrui, ma vorrei avere qualche spiegazione in più.
Non voglio fare di testa mia, vorrei solo avere delle risposte più precise e vorrei capire il perchè di ciò che mi viene detto.
Non voglio ignorare nessuno, anzi.

Per andare a creare l'albero, in avvio del programma, quanto tempo spenderei? Dovrei creare 95mila nodi solo per contenere le parole, più tutti i nodi padri di questi per memorizzare le varie radici. Ed ogni volta devo allocare memoria, sistemare i puntatori ecc ecc.
Tutto questo non dovrebbe costare un bel pò?

- - - Updated - - -

Ho anche postato un link che sembra andare nella mia direzione, dove un programmatore analizza pro e contro dei vari metodi e sembra si possa fare a meno di un ADT complesso pur mantenendo una buona competitività, ma non mi è stato risposto.
 
Alla fine ho implementato la ricerca come l'avevo descritta, senza utilizzare alberi o hash table, ma tramite lettura diretta del dizionario e chiamate ripetute a funzione.
Analizzo l'intero dizionario trovando tutte le parole nella scacchiera in circa 80ms. Credo sia un risultato accettabile
 
Pubblicità
Pubblicità
Indietro
Top