Torna indietro   Hardware Upgrade Forum > Software > Programmazione

AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
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


AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
A Seul in arrivo nuovi incentivi per aut...
7 offerte nuove di zecca Amazon, altre a...
Una giornata di lavoro con l'IA consuma ...
'Non fate usare ChatGPT ai vostri cari':...
Un display che si allunga fino al 200% s...
X rende open source il suo algoritmo: si...
Ryanair si prepara a un'estate da record...
Robot aspirapolvere da 199€ su Amazon: D...
Questo deumidificatore COMFEE' da 12L/24...
GoPro HERO13 Black Ultra Wide Edition ca...
L'Unione Europea prepara un nuovo pacche...
L'arma segreta di Kiev non spara ma potr...
Hitman: World of Assassination introduce...
Netflix non si ferma più: record di abbo...
Porsche America è riuscita ad abi...
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: 11:47.


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