Oppure

Loading
03/02/13 10:37
xProgrammer89x
Salve, apro questo post per chiedere un aiuto, o consiglio su come fare un'operazione, stavolta con alcuni aggiornamenti.

Dunque, ho completato un database di parole, ed un altro di corrispondenti id univoci, usando l'ordinatore per riscriverli in ordine alfabetico, e crescente nel caso degli id, tutti in colonna però in 2 file .txt in locale, ai quali il programma farà riferimento.

Quello che starei cercando di creare, è come una specie di sistema di licenze.

Ogni file, ha però circa 250.000 parole al suo interno, e vorrei fare in modo che data in input una stringa, lui controlli uno dei 2 file txt, ad esempio quello di parole, e restituisca "è presente", o "non è presente".

Ho subito pensato di utilizzare l'algoritmo binario per far si che impieghi poco tempo a fare il controllo.

Ad esempio data la prima lettera della parola, lui accede al centro del .txt eliminando una delle due metà non interessate, e così andando, fino alla fine, e verrebbero intorno alle 10-20 iterazioni a seconda della presenza della parola.

Il ragionamento credo sia giusto, o almeno io non ho trovato alternative migliori.

Il problema è che so applicare questo sistema soltanto ai vettori, e non a file .txt, ma non la vedo difficile.

Qualcuno di voi più esperto può darmi qualche suggerimento?

Ringrazio in anticipo.
Ultima modifica effettuata da xProgrammer89x 03/02/13 10:38
aaa
03/02/13 11:24
HeDo

con la ram a disposizione dei computer odierni, fai prima a mettere tutte le linee dei file (parole) in un HashSet e controllare con Contains se è presente o no. In realtà non si sacrifica più di tanto la memoria e lo speedup è ragguardevole in quanto l'operazione Contains è O(1).
Ti assicuro che è un buon metodo, l'ho implementato nel programmino per trovare le parole di ruzzle XD
aaa
03/02/13 12:10
xProgrammer89x
Postato originariamente da HeDo:


con la ram a disposizione dei computer odierni, fai prima a mettere tutte le linee dei file (parole) in un HashSet e controllare con Contains se è presente o no. In realtà non si sacrifica più di tanto la memoria e lo speedup è ragguardevole in quanto l'operazione Contains è O(1).
Ti assicuro che è un buon metodo, l'ho implementato nel programmino per trovare le parole di ruzzle XD


Non ho ben capito cosa fare, e come fare, puoi spiegarmelo meglio?
Sei riuscito addirittura a trovare tutte le parole del gioco ruzzle?!
Come hai fatto, se oltre al vocabolario in questo caso il programma deve prima provare tutte le combinazioni di parole nella griglia?!
aaa
03/02/13 14:40
HeDo
Postato originariamente da xProgrammer89x:

Non ho ben capito cosa fare, e come fare, puoi spiegarmelo meglio?
Sei riuscito addirittura a trovare tutte le parole del gioco ruzzle?!
Come hai fatto, se oltre al vocabolario in questo caso il programma deve prima provare tutte le combinazioni di parole nella griglia?!


beh come fare a spiegarlo meglio?


// Ipotesi: la parola da controllare e il dizionario sono solo con lettere minuscole

// Creo e carico il dizionario delle parole
HashSet<string> words = new HashSet<string>();
words.AddRange(File.ReadAllLines("dictionary.txt"));

[...]

// Per controllare se una parola è nel dizionario
if (words.Contains("ciao")) {
    // Il dizionario contiene "ciao"
}



Per quanto riguarda ruzzle la cosa è un po più complessa. Per quanto riguarda il controllo se una parola è nel dizionario è come ti ho fatto vedere, invece per l'estrazione delle parole dallo schema bisogna mettere su una ricerca (ricorsiva) esaustiva di tutte le combinazioni possibili.

aaa
03/02/13 15:46
xProgrammer89x
beh come fare a spiegarlo meglio?


// Ipotesi: la parola da controllare e il dizionario sono solo con lettere minuscole

// Creo e carico il dizionario delle parole
HashSet<string> words = new HashSet<string>();
words.AddRange(File.ReadAllLines("dictionary.txt"));

[...]

// Per controllare se una parola è nel dizionario
if (words.Contains("ciao")) {
    // Il dizionario contiene "ciao"
}



Per quanto riguarda ruzzle la cosa è un po più complessa. Per quanto riguarda il controllo se una parola è nel dizionario è come ti ho fatto vedere, invece per l'estrazione delle parole dallo schema bisogna mettere su una ricerca (ricorsiva) esaustiva di tutte le combinazioni possibili.



Non sono riuscito a provare il codice, per il momento ci sto provando in C#, ma c'è un piccolo problema.

Il file .txt non si trova in locale, ma è caricato in rete, essendo un sistema di licenze, quindi all'interno del codice, dovrò specificare un link terminante col nome ed il formato del file contenente le parole, e quindi non so come procedere.

Una volta fatto questo, non mi rimarrà altro che scrivere la parte di codice, che data in input la parola, controlla se presente all'interno della lista.

Puoi darmi qualche altra dritta?
aaa
03/02/13 17:23
HeDo

Per scaricare un file da remoto (o solo il suo contenuto) puoi usare la classe WebClient

msdn.microsoft.com/it-it/library/…(v=vs.80).aspx

guarda in particolare i metodi DownloadString e DownloadFile
aaa
03/02/13 20:09
xProgrammer89x
Postato originariamente da HeDo:


Per scaricare un file da remoto (o solo il suo contenuto) puoi usare la classe WebClient

msdn.microsoft.com/it-it/library/…(v=vs.80).aspx

guarda in particolare i metodi DownloadString e DownloadFile


Ho studiato un po' i comandi, e sono riuscito a farlo, ma vorrei farlo senza scaricare nulla, e ci sono riuscito, c'è un però.

Ho usato il comando

 
if (webBrowser.DocumentText.Contains(TextBox.Text)) MessageBox.Show("Esiste");
else MessageBox.Show("Non esiste");


ed è anche veloce.

Per testare ho fatto in modo che l'utente scrive all'interno di una text, la stringa in maiuscolo, da cercare all'interno della lista (la prima, con parole in maiuscolo)

Ho fatto vari test, e funziona tutto come deve, ho aperto lo stesso progetto su un altro computer, ed andandolo ad eseguire, il programma restituisce sempre "Non esiste", e non riesco a capire da cosa dipenda-

Cosa importante che ho notato, che sul secondo pc, il webbrowser quando si collega al file .txt, visualizza le parole in minuscolo, mentre le dovrebbe visualizzare in maiuscolo, come sull'altro pc, perchè il file è fatto da sole parole scritte in maiuscolo.

Non sono quindi riuscito a capirne il motivo, ma è importante che lo risolva, altrimenti agli utenti che hanno questo stesso problema, il programma al controllo della licenza, darà sempre esito negativo.

Il secondo pc ha Seven 64 Bit, mentre il primo su cui funziona, Vista 32 Bit, non so se può importare.

Sai cosa può essere?
Ultima modifica effettuata da xProgrammer89x 03/02/13 20:12
aaa
04/02/13 11:23
HeDo
ma che cavolo di senso ha scomodare un webbrowser?
ti ho postato quella classe che fa ESATTAMENTE quello che ti serve fare.
il webbrowser presenta tutta una serie di problemi che vanno dal fatto che in realtà è solo un wrapper managed di un componente COM, al fatto che bisogna gestire lo stato di avanzamento di caricamento della pagina, ai problemi di performances e alla memoria utilizzata.
mi spieghi che cosa ci vuole a scaricare il contenuto con DownloadString, dividerlo in stringhe con Split, inserirlo in un HashSet e chiamarci sopra Contains?
no perchè altrimenti che serve chiedere aiuto sul forum se tanto si fa di testa propria?
aaa