Struttura dei dati della mappa efficiente che supporta la ricerca approssimativa


25

Sto cercando una struttura di dati che supporti ricerche approssimative efficienti di chiavi (ad esempio, la distanza di Levenshtein per le stringhe), restituendo la corrispondenza più vicina possibile per la chiave di input. La struttura di dati più adatta che ho trovato finora sono gli alberi di Burkhard-Keller , ma mi chiedevo se ci fossero altre / migliori strutture di dati per questo scopo.

Modifica: ulteriori dettagli sul mio caso specifico:

  • Le stringhe di solito hanno una differenza Levenshtein abbastanza grande l'una dall'altra.
  • Le stringhe hanno una lunghezza massima di circa 20-30 caratteri, con una media più vicina a 10-12.
  • Sono più interessato alla ricerca efficiente che all'inserzione, poiché costruirò un insieme di dati prevalentemente statici che voglio interrogare in modo efficiente.

Esistono condizioni sulla stringa di input e la dimensione del numero di elementi nella mappa? Quanto deve essere efficiente l'inserimento nella mappa?
edA-qa mort-ora-y

mrm, per quanto ne so, gli alberi BK guardano ancora una grande porzione dell'intero albero. Ma potrebbe essere un'ottimizzazione prematura da parte mia, immagino?
merijn,

3
Strettamente correlato al punto di essere quasi un duplicato: strutture dati efficienti per la creazione di un correttore ortografico veloce
Raffaello

Risposte:


18

nO(d)O(d)nO(dϵ)31/ϵnd11

Se sei disposto a prendere in considerazione altre distanze, l'hashing sensibile alla località (LSH) fa un ottimo lavoro. L'hashing sensibile alla località è una tecnica introdotta da Indyk e Motwani per risolvere il problema ANNS, in cui i punti che vivono in uno spazio ad alta dimensione (leggi lunghi vettori, lunghe stringhe, ecc.) Sono incisi in un piccolo numero di bucket in modo che punti che sono vicini l'uno all'altro sono mappati sullo stesso cestino con buona probabilità e i punti distanti l'uno dall'altro sono mappati su contenitori diversi, anche con buona probabilità. C'è un ottimo articolo di indagine molto accessibile di Indyk e Andoni su CACM . Questa tecnica è semplice e veloce e richiede poco spazio; c'è anche del codice là fuori (penso che l'articolo si colleghi al codice). Funziona bene per cose come la distanza di Hamming (e in alcuni regimi1

Questo tipo di domanda si adatta bene a cstheory.SE . C'è una domanda correlata lì , ma sembra chiedere un esatto vicino di casa.


12

Le strutture di dati che ti interessano sono alberi metrici. Cioè, supportano ricerche efficienti in spazi metrici. Uno spazio metrico è formato da un insieme di oggetti e una funzione di distanza definita tra loro che soddisfa la disuguaglianza del triangolo. L'obiettivo è quindi, dato un insieme di oggetti e un elemento di query, per recuperare quegli oggetti abbastanza vicini alla query.

Poiché i problemi di ricerca sono letteralmente ovunque nell'informatica, esiste un'enorme quantità di diversi alberi metrici. Tuttavia, possono essere divisi almeno in due gruppi: basati su pivot e basati su cluster (e sicuramente ci sono anche ibridi). Un buon sondaggio è E. Chavez et al., Searching in Metric Spaces, 2001 . Vedere ad esempio Capitolo 5: Soluzioni attuali agli spazi metrici, pagina 283.

O(nα)0<α<1O(n2)O(1)

Chavez et al. offre anche una bella panoramica degli altri alberi e naturalmente più riferimenti se qualcuno in particolare stimola il tuo interesse. In pratica, le prestazioni di alberi diversi vengono spesso valutate sperimentalmente. Questo penso che dipenda molto dalla struttura dello spazio. Pertanto è difficile dire quale albero in particolare sarebbe il più efficiente nel tuo caso. Tuttavia, penso che sia una buona idea andare prima con il più semplice. Se gli alberi BK sono i più facili da costruire, provali prima. Se non soddisfano le tue esigenze, investi tempo (e forse tempo di programmazione) nella raccolta di ulteriori informazioni sul tuo spazio che potrebbero aiutarti a prendere decisioni più informate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.