Trova il conteggio di ogni parola in una stringa

2

Sono alla ricerca di un algoritmo di rendimento migliore per implementare un programma, per trovare il conteggio di ogni parola in una frase i.e .., una stringa nel senso della programmazione.

So che il mio algoritmo è troppo semplice e Noob. Ecco il mio algoritmo.

  1. Leggi la stringa.
  2. Tokenizzare la stringa con il delimitatore, inserire ciascun token in una lista (ArrayList).
  3. Fai scorrere l'elenco generato, in ogni iterazione confronta la stringa corrente con ogni altra stringa della lista, se corrisponde aumenta il conteggio di questa stringa.
  4. Per ogni iterazione, metti la stringa e il suo conteggio in una mappa.
  5. Iterare la mappa e visualizzarla, con la chiave come stringa e valore come conteggio.

Qual è l'approccio migliore di questo?

    
posta srk 16.05.2013 - 19:15
fonte

4 risposte

7

Sostituisci i passaggi 3 e 4 con il seguente

  • Se la stringa non è nella mappa, memorizzala nella mappa con valore Integer.valueOf(1)
  • Se è già presente nella mappa, ottieni il valore corrente, incrementalo e sostituisci la mappatura.
risposta data 16.05.2013 - 19:22
fonte
1
  1. Crea uno scanner per InputStream, Reader, File, Stringa, ecc.
  2. Iterate sui token
  3. Se una parola non esiste già nella tua mappa, aggiungila con il valore 1.
  4. Se una parola esiste già nella mappa, incrementa il suo valore.
  5. Al termine, chiudi lo scanner.
  6. Esegui l'iter sulla mappa e visualizzalo.

La tua soluzione e @ parsifal richiedono un paio di passaggi non necessari che sono stati evitati con questa soluzione:

  • Quando si utilizza uno scanner per leggere InputStream, Reader o File, non è necessario leggere l'intera memoria in una sola volta, rendendo questa soluzione compatibile con input molto grandi.
  • Oltre a memorizzare l'intero input in una stringa, si duplica l'intera cosa (meno spazi) in una ArrayList. In questa soluzione non c'è spazio intermedio.

Ecco una rapida introduzione allo scanner .

    
risposta data 16.05.2013 - 19:34
fonte
0

La parte inefficiente del tuo algoritmo è in realtà l'ArrayList, perché non può essere attraversato in modo efficiente. La struttura dati appropriata è nel tuo caso un albero binario.

Una discussione molto dettagliata sugli alberi binari: link

    
risposta data 16.05.2013 - 19:24
fonte
0

Il trucco è usare la giusta struttura dati per il lavoro, e in questo caso la giusta struttura dati è un multiset. In realtà, la risposta è al multiset, non hai nemmeno bisogno di un algoritmo.

Ecco un esempio in Ruby:

require 'multiset'

s = 'Hello World Hello Programming Hello World'

Multiset.new(s.split)
# => #<Multiset:#3 "Hello", #2 "World", #1 "Programming">
    
risposta data 17.05.2013 - 03:00
fonte

Leggi altre domande sui tag