Trova gli elementi che si trovano in almeno


11

Considera insiemi di valori (rappresentati come array ordinati senza duplicati e con una dimensione nota (ovvero la dimensione può essere ottenuta in O (1)). I valori possono essere testati per l'uguaglianza nel tempo O (1). per ottenere l'insieme di valori presenti in almeno insiemi diversi tra i .nKn

L'algoritmo ovvio per farlo è quello di esaminare tutti gli insiemi, contare il numero di occorrenze di ciascun valore e restituire quelli con un conteggio superiore a . Tuttavia, in alcuni casi, puoi fare di meglio: ad esempio, quando e quando un set è molto più piccolo dell'altro set , è più efficiente guardare tutti gli elementi di ed eseguire una ricerca binaria per ciascuno di essi in : l'approccio di ricerca binaria costa mentre l'approccio ingenuo costa che è peggio quando.Kn=K=2S1S2S1S2O(|S1|log(|S2|))O(|S1|+|S2|)|S1|<<|S2|

Con questo in mente, in quali situazioni possiamo fare meglio dell'algoritmo ingenuo? (Se questo è un problema ben noto, sarei felice di conoscere il suo solito nome e di avere riferimenti.)


3
Questo rientra nella categoria generale dei risultati "top-K", o "battitori pesanti". Quest'ultimo è più vicino a quello che stai cercando. La maggior parte del lavoro in questo spazio si concentra su grandi set di dati e restrizioni di memoria sublineare.
Suresh Venkat,

9
Il metodo "cerca tutte le posizioni di S1 ​​in S2" che puoi dare può essere eseguito nel tempo , sempre valido almeno quanto l'ingenuo lineare algoritmo temporale. O(|S1|log(|S2|/|S1|))
David Eppstein,

Risposte:


2

OK, penso di aver trovato qualcosa di rilevante: questo documento menziona un "problema di occorrenza di T" nella sezione III (p. 2) che è esattamente il nostro problema (dove è ciò che abbiamo chiamato k ), nascosto dietro un gergo specifico del dominio. L'algoritmo ScanCount che propongono è l'approccio ingenuo che ho suggerito nella mia domanda. L'algoritmo MergeOpt è una generalizzazione del trucco di ricerca binaria. La loro proposta principale (DivideSkip) è una combinazione di questo trucco di ricerca binaria e un trucco diverso (MergeSkip) per saltare più valori. Sembra persino che sperimentalmente gli approcci intelligenti siano molto migliori degli approcci ingenui (guarda la colonna "Nessun filtro" a pagina 8, i filtri sono euristici per le loro cose specifiche del dominio).TK

Questo può essere combinato con il trucco di David Eppstein per rendere più efficienti le ricerche binarie in e con l'idea di usare la ricerca interpolazione invece della ricerca binaria (un'idea di questo altro documento dallo stesso campo ).S2


1

Il problema è simile al problema del data mining relativo alla ricerca di set di articoli frequenti , noto anche come apprendimento delle regole di associazione . Se ho capito bene, il tuo problema potrebbe ridursi alla ricerca di articoli frequenti di cardinalità 1 (ad es., Singleton) con supporto > = k . Naturalmente, gli algoritmi disponibili (come Apriori, Eclat, D-CLUB ecc.) Per il problema consentono anche di determinare frequenti set di cardinalità> 1.

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.