Quale struttura dati è la migliore per un menu a discesa automatico che apprende?

1

Ho creato una casella di testo di completamento automatico per un'applicazione su cui sto lavorando. La casella di testo ha fondamentalmente un elenco associato che cerca ogni volta che inserisci qualcosa nella casella.

Se si inserisce qualcosa che non è nella casella e si preme "OK", la voce viene aggiunta a quella lista associata nella posizione ordinata usando un inserto binario (in pratica ricerca binaria per la posizione corretta).

In questo momento sto usando un ArrayList per memorizzare i dati e una ricerca binaria per la ricerca. La mia domanda è questa: in termini di complessità temporale, ArrayList è la migliore opzione per questa situazione? O sto meglio usando un qualche tipo di albero di ricerca binario?

    
posta namarino 08.06.2017 - 09:29
fonte

3 risposte

2

Quello che stai cercando è una variante del Radix Tree , più precisamente vuoi un Albero Prefisso .

Questa è una struttura gerarchica dei dati, ordinata per "prefissi" delle parole (da cui il nome). Le parole valide sono le foglie.

Il tempo di ricerca corrisponderebbe comunque alla complessità della ricerca binaria ( O(log n) ), ma anche il tempo di inserimento e cancellazione sarebbe migliore ( O(log n) ) rispetto a ArrayList ( O(n) ammortizzato), perché l'ArrayList deve spostarsi elementi intorno alla matrice di sottofondo (o assegnarne uno nuovo sulla crescita).

Il tempo di inserimento e cancellazione potrebbe o potrebbe non essere un problema, a seconda della frequenza con cui si verificano tali operazioni.

Per quanto ne so, non esiste un prefisso standard in Java. Tuttavia l'interfaccia NavigableMap sembra essere una buona alternativa dato che è possibile interrogare l'oggetto più vicino (usando i metodi ceiling e floor), e TreeMap avrebbe anche una complessità simile ad essere un albero.

Puoi utilizzare TreeMap<String, Boolean> e solo mettere true e lavorare sul set di chiavi.

    
risposta data 08.06.2017 - 09:53
fonte
1

In generale, è una buona idea scegliere la migliore struttura dati per il lavoro.

Detto questo, finché hai a che fare con i dati che si intendono utilizzare per la selezione manuale da parte degli umani e che provengono dall'inserimento manuale, la quantità di dati è quasi certamente così piccola (per un computer) che non importa quale tipo di contenitore stai usando. Sulle macchine di oggi, qualsiasi vecchia struttura dati può gestire un paio di migliaia di articoli e non noterai mai la differenza di velocità. Quasi certamente non vale la pena dedicare del tempo a fare qualcosa di non ovvio qui.

    
risposta data 08.06.2017 - 09:34
fonte
1

Considera TreeSet .

From javatpoint.com : treeset

import java.util.*;  

class TestCollection11{  

     public static void main(String args[]) {  

          //Creating and adding elements  
          TreeSet<String> al = new TreeSet<String>();  
          al.add("Ravi");  
          al.add("Vijay");  
          al.add("Ravi");  
          al.add("Ajay");  

          //Traversing elements  
          Iterator<String> itr = al.iterator();  
          while( itr.hasNext() ) {  
               System.out.println(itr.next());  
          }  
     }  
}  

output

Ajay
Ravi
Vijay

In effetti, la scelta della migliore struttura dati semplifica la vita.

    
risposta data 08.06.2017 - 09:37
fonte

Leggi altre domande sui tag