Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
La seconda generazione della citycar elettrica di Dacia passa alla piattaforma RGEV small di Renault Group, cresce di 15 cm in lunghezza e 18 cm in larghezza, adotta un motore da 80 CV e una batteria LFP da 27,5 kWh per 250 km WLTP. Prezzi da 17.900 euro, produzione a Novo Mesto in Slovenia.
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-03-2006, 18:24   #1
tagibo
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 17
[JAVA] Estrazione parole da file

Devo estrarre da un file di testo tutte le parole contenute, per poi riversarle man mano in una hash table contandone la frequenza.
Per ora mi interessa solo l'estrazione delle parole dal file; io ho scritto questo codice:
Codice:
public static void ExtractAndAdd(String s){
	int i=0;
	String r="",c="";
	while (i<s.length()){
		r=""; c=s.substring(i,i+1);
		while(!utility.isDelim(c)){
			r=r+c;
			i++;
			c=s.substring(i,i+1);
		}
		if (utility.isDelim(s.substring(i,i+1))) i++;
		add(r); //aggiungo ad hash table
	}

	public static boolean isDelim(String s) {
		char c = s.charAt(0);
		if (c == ' '
			|| c == ','
			|| c == '.'
			|| c == ';'
			|| c == ':'
			|| c == '?'
			|| c == '!'
			|| c == '\"'
			|| c == '\''
			|| c == '#'
			|| c == '('
			|| c == ')')
			return true;
		return false;
	}
}
Prima di continuare a scrivere il resto del codice, volevo chiedere se secondo voi una cosa del genere è abbastanza efficiente (considerando che devo controllare una serie di file di almeno 10mb), o se devo utilizzare altri metodi.
Aspetto le vostre risposte!
Ciao!

Ultima modifica di tagibo : 07-03-2006 alle 18:26.
tagibo è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2006, 18:58   #2
pinok
Senior Member
 
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
Non potevi usare un readLine per leggere le righe del file una ad una, e su ogni riga invocare lo stringTokenizer passandogli come delimitatori tutti quelli che ti vengono in mente ?
Mi pare che l'aggiunta alla hashtable sia ancora da scrivere, vero ?
pinok è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2006, 19:00   #3
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
usa uno StringTokenizer, secondo me è meglio......MOLTO
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2006, 19:14   #4
tagibo
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 17
Quote:
Originariamente inviato da pinok
Non potevi usare un readLine per leggere le righe del file una ad una, e su ogni riga invocare lo stringTokenizer passandogli come delimitatori tutti quelli che ti vengono in mente ?
Sì, il metodo ExtractAndAdd lo invoco dentro un metodo read dove leggo una ad una le righe del file.
Quote:
Originariamente inviato da franksisca
usa uno StringTokenizer, secondo me è meglio......MOLTO
Non conosco però questo stringTokanizer. Mi potreste dare più informazioni?
Quote:
Originariamente inviato da pinok
Mi pare che l'aggiunta alla hashtable sia ancora da scrivere, vero ?
Sì, faccio un passo per volta, intanto penso all'estrazione delle parole.... piano piano spero di arrivare alla fine!
Grazie a tutti e due!
tagibo è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2006, 19:19   #5
pinok
Senior Member
 
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
Quote:
Originariamente inviato da tagibo
Non conosco però questo stringTokanizer. Mi potreste dare più informazioni?
Ecco qua: http://java.sun.com/j2se/1.4.2/docs/...Tokenizer.html

C'è anche l'esempio
Codice:
StringTokenizer st = new StringTokenizer("this is a test");
while (st.hasMoreTokens()) 
{
   System.out.println(st.nextToken());
}
Produce
this
is
a
test

Perchè di default lo spazio è coniderato come delimitatore.
Puoi costruirlo con

StringTokenizer st = new StringTokenizer("this is a test", "\t;.:-_");

per considerare tutto quello che c'è nella seconda stringa come delimitatore (ci aggiungi quello che vuoi)
pinok è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2006, 19:26   #6
tagibo
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 17
GRAZIE! Ora provo subito.
Ciao!
tagibo è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2006, 08:18   #7
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
beh, ti hanno dato degli ottimi suggerimenti, per cui non ci sarebbe bisogno di aggiungere altro.
Solo due cose:
1 - il tuo codice potrebbe portarti, in alcuni casi, a sfondare la dimensione massima della stringa, ottenendo un'eccezione di Out of Bounds: infatti prima controlli che la variabile i stia nei limiti, poi la incrementi. Non e' detto che il suo valore incrementato stia ancora nei limiti, no? (magari ho visto male,correggimi se sbaglio);

2 - Prova ad usare gli alberi binari invece della hash table. Ovviamente li devi implementare, ma se il tuo problema e' l'efficienza ne potrebbe valere la pena


High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 09-03-2006, 20:37   #8
tagibo
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 17
Quote:
Originariamente inviato da sottovento
1 - il tuo codice potrebbe portarti, in alcuni casi, a sfondare la dimensione massima della stringa, ottenendo un'eccezione di Out of Bounds: infatti prima controlli che la variabile i stia nei limiti, poi la incrementi. Non e' detto che il suo valore incrementato stia ancora nei limiti, no? (magari ho visto male,correggimi se sbaglio);

2 - Prova ad usare gli alberi binari invece della hash table. Ovviamente li devi implementare, ma se il tuo problema e' l'efficienza ne potrebbe valere la pena


High Flying
Sottovento
1 - Non ho fatto il controllo pensando che ogni file debba sempre terminare con un . o comunque con delimitatore (in italiano non ho mai visto terminare frasi senza un . o un ? o un !) e quindi non avrei problemi con l'OutOfBounds.
E' un po' rischioso, ma se uno rispetta la grammatica italiana....
2 - intanto fammi cimentare con le hash table, visto che l'ho usate poche volte.... Sicuramente può essere interessante implementare entrambi i metodi per poi confrontarli e vedere qual'è la diff. di efficenza. Quasi quasi lo faccio....
Grazie a tutti!
tagibo è offline   Rispondi citando il messaggio o parte di esso
Old 09-03-2006, 21:00   #9
pinok
Senior Member
 
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
Quote:
Originariamente inviato da tagibo
Sicuramente può essere interessante implementare entrambi i metodi per poi confrontarli e vedere qual'è la diff. di efficenza. Quasi quasi lo faccio....
Grazie a tutti!
La hashtable dovrebbe già essere ottimizzata per le operazioni di ricerca e inserimento.
Se vuoi testare dei miglioramenti, potresti anche prendere in considerazione l'idea di farti tante hashtable quante sono le lettere dell'alfabeto più i numeri 0-9, in modo da allegerire i controlli con il crescere del numero di parole
pinok è offline   Rispondi citando il messaggio o parte di esso
Old 09-03-2006, 21:37   #10
tagibo
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 17
Quote:
Originariamente inviato da pinok
La hashtable dovrebbe già essere ottimizzata per le operazioni di ricerca e inserimento.
Se vuoi testare dei miglioramenti, potresti anche prendere in considerazione l'idea di farti tante hashtable quante sono le lettere dell'alfabeto più i numeri 0-9, in modo da allegerire i controlli con il crescere del numero di parole
Quindi fare una specie di vocabolario??
tagibo è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 01:20   #11
pinok
Senior Member
 
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
Quote:
Originariamente inviato da tagibo
Quindi fare una specie di vocabolario??
Se lo vuoi chiamare così, diciamo di si.
O un'enciclopedia, che rende meglio l'idea.
Se hai una parola che inizia per L, pensa cosa vuol dire andarla a cercare dentro un libro di 24.000 pagine (per esempio) o piuttosto dentro al libro L con solo 1000 pagine.
Fai meno fatica a sollevarlo e a consultarlo, no?
Ovviamente, dipende dal numero di parole. Se sono poche, non avrai grosse ricerche da fare. Se sono tante, si
pinok è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 08:33   #12
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da pinok
La hashtable dovrebbe già essere ottimizzata per le operazioni di ricerca e inserimento.
Se vuoi testare dei miglioramenti, potresti anche prendere in considerazione l'idea di farti tante hashtable quante sono le lettere dell'alfabeto più i numeri 0-9, in modo da allegerire i controlli con il crescere del numero di parole
Scusate l'intervento, spero che non sia di disturbo. Volevo semplicemente dire che gli algoritmi di inserimento e ricerca in tabella hash sono ottimi, specialmente se hai tanta memoria e non troppi dati. Al crescere del numero di dati, la complessita' non potra' che tendere a O(n).
Gli alberi binari saranno sempre O(log(n)).
E' estremamente probabile che con pochi dati le tabelle hash diano prestazioni superiori, ma al crescere del numero delle parole la situazione si ribalti.

Naturalmente il linguaggio implementa gia' le hash table e non implementa i bintree, ed anche questo e' un fattore da tenere in considerazione. Cmq per quanto ottimizzate per ricerca ed inserimento, la hash verra' superata in prestazioni dai bintree.

Chiedo scusa ancora per questo intervento sicuramente poco pratico

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 10:59   #13
tagibo
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 17
Quote:
Originariamente inviato da pinok
Se lo vuoi chiamare così, diciamo di si.
O un'enciclopedia, che rende meglio l'idea.
Se hai una parola che inizia per L, pensa cosa vuol dire andarla a cercare dentro un libro di 24.000 pagine (per esempio) o piuttosto dentro al libro L con solo 1000 pagine.
Fai meno fatica a sollevarlo e a consultarlo, no?
Ovviamente, dipende dal numero di parole. Se sono poche, non avrai grosse ricerche da fare. Se sono tante, si
L'unica cosa che non mi torna è come richiamare la tabella hash giusta dove poter inserire la parola. Ad esempio:
Codice:
        
        nextStr = filebuf.readLine();     
        while (nextStr != null){
            st = new StringTokenizer(nextStr,delim);
            .............
            metodi.addHash(mappa_giusta,st);
            nextStr = filebuf.readLine(); 
        } 
        filebuf.close();
Cosa ci metto al posto dei puntini??
Quote:
Originariamente inviato da Sottovento
Scusate l'intervento, spero che non sia di disturbo. [....] Chiedo scusa ancora per questo intervento sicuramente poco pratico
High Flying
Sottovento
E che disturbo dai?? I forum sono nati apposta per scambiare idee e suggerimenti nella reciproca correttezza verbale!!
Anzi, ti ringrazio del tuo intervento perchè agli alberi di ricerca non ci avevo proprio pensato, dopo averlo implementato con le tabelle hash voglio provare a farlo anche con gli alberi!

Grazie e ciao a tutti!
tagibo è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 13:18   #14
pinok
Senior Member
 
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
Per richiamare la tabella giusta, potresti farti un array di hash e un metodo, ad es:

int indiceFromLettera(String iniziale) { .... }

in cui scrivi un qualche algoritmo che dalla lettera ti dà la posizione (ad es., A=0, B=1 ecc).
Quindi la hash nella posizione 0 dell'array è quella per la A, nella pos. 1 è quella per la B ecc.
pinok è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 14:32   #15
crick_pitomba
Member
 
Iscritto dal: Oct 1999
Messaggi: 111
Quote:
Originariamente inviato da sottovento
Al crescere del numero di dati, la complessita' non potra' che tendere a O(n).
Gli alberi binari saranno sempre O(log(n)).
E' estremamente probabile che con pochi dati le tabelle hash diano prestazioni superiori, ma al crescere del numero delle parole la situazione si ribalti.
Non sono perfettamente d'accordo.
le hash table sono nate per compiere le operazioni di ricerca e inserimento in tempo O(1): è per quello che hanno bisogno di tanta memoria.


In ogni caso i due algoritmi non sono confrontabili: uno è basato sui confronti, l'altro su operazioni matematiche che ti danno l'accesso ai dati.

l'O(log(n)) degli alberi binari è riferito al numero di confronti necessario per individuare la chiave cercata.

Le tabelle di hash non effettuano confronti: la funzione di hash ti dice "in che cella inserire il valore" a meno che non ci siano collisioni: per questo sono in tempo costante.

potrebbe tendere ad o(n) solo se la funzione di hash fa particolarmente pena e praticamente tutti i dati vanno a finire in nella stessa cella ed utilizzi un sistema di gestione delle collisioni basate su concatenazioni: tutti i dati vanno a finire nello stesso slot e crei una catena lunga n elementi in cui fare la ricerca...

ma a questo punto un banale albero binario presenta lo stesso identico problema se inserisci n elementi ordinati ed ottieni un albero fortemente sbilanciato: puoi risolvere questo problema usando alberi rb o b alberi.
crick_pitomba è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 14:52   #16
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao
ottima osservazione.
Mi riferivo appunto al fatto di ottenere O(n) al crescere del numero di elementi, visto il problema in esame. E, sempre per il problema in esame, e' poco probabile che un albero sia sbilanciato.

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2006, 18:16   #17
tagibo
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 17
E l'esercizio continua.... QUI!
tagibo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa Nuova Dacia Spring, del modello precedente resta...
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Troppe patch generate dall'IA: anche chi...
Comprata e spenta il giorno dopo: cos'er...
Google lancia Tabletop, l'IA che trasfor...
SpaceX e Tesla verso la fusione del seco...
One UI 9.5 arriva anche su Galaxy S25: S...
Kimi K3 gira in casa senza GPU, sulla me...
Il futuro di GeForce dopo Huang: NVIDIA ...
Windows, un bug lascia aperte le conness...
HONOR conquista il mercato cinese: la se...
Milioni di siti a rischio hacking: Apach...
La nuova mossa di Huawei: un secondo bra...
Nissan Leaf cambia pelle: la terza gener...
AliExpress 11.11, pioggia di offerte su ...
Nuova promo DAZN: piano Family a meno di...
Pixel, l'aggiornamento di novembre blocc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v