Algoritmo per i numeri 'k' più frequenti


19

Ho cercato l'algoritmo più efficiente (streaming ??) che mi dice gli elementi "k" che si verificano più frequentemente in un flusso di dati in qualsiasi momento. Questo post: gli algoritmi del flusso di dati "Dividi e conquista" mi hanno interessato.

Ad esempio, supponiamo che ci siano numeri: (4,3,5,1,6,2,4,3,3,8,9,1) e io chiedo i 3 numeri che si verificano più frequentemente (diciamo), quindi dovrei ottieni (3,4,1) come risposta.

Ho provato a cercare online, ma non sono riuscito a trovare un posto che dia un approccio e dica che è il migliore. Una soluzione banale sarebbe quella di usare un heap o un albero binario bilanciato, ma penso che ci sia un modo migliore e volevo sapere se è documentato da qualche parte.

Modifica: sto cercando un algoritmo che dia sempre la risposta corretta rispetto a un algoritmo di appromix (molti dei quali compaiono nei risultati di ricerca) che si basano sulla distribuzione dei dati in un modo o nell'altro


In realtà ci sono tre tipi di algoritmi: esatto, approssimativo e "dipendente dai dati". Hai escluso l'ultimo tipo, ma sono ammessi algoritmi approssimativi che NON dipendono dalla distribuzione dei dati? come ho indicato, in caso contrario, sei nei guai a causa di limiti inferiori noti per questo problema in un'impostazione di flusso.
Suresh Venkat,

1
Ero curioso di sapere se gli algoritmi che utilizzano memoria limitata (algoritmi di streaming) possono effettivamente fare quello che volevo e sembra che non possano farlo come hai sottolineato. Anche se è noto un algoritmo esatto non in streaming che risolve il problema in O (n) il tempo peggiore garantito, che è menzionato qui (citato dall'articolo di Cormode e Hadjileftheriou dal link fornito): citeseerx.ist.psu. edu / viewdoc / summary? doi =
10.1.1.106.7889

Risposte:


20

K=1o(n)

n/K

KK


1
+1. Penso che l'algoritmo> 50% delle volte sia ben noto (algoritmo a elementi maggioritari) come hai detto tu
dhruvbird,

2
Grazie!! L'articolo di Cormode e Hadjileftheriou che hai citato cita questo documento: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.106.7889 che ha la stessa tecnica a cui stavo pensando. Mantiene 2 elenchi collegati; uno per frequenza e al suo interno un altro elenco di tutti gli elementi con la stessa frequenza.
Dhruvbird,

puoi elaborare l'algoritmo di oltre il 50 percento? e il puzzle di google? Non posso seguire questo ragionamento sciatto perché l'hai appena toccato e non hai speso del tutto il "noto trucco". Grazie.


Questo è un commento (non abbastanza reputazione) sul link di Suresh Venkat userweb.cs.utexas.edu/users/misra/scannedPdf.dir/… : sembra che l'algoritmo presentato lì richieda un secondo passaggio attraverso i dati, il che non è consentito Qui. In realtà, non vedo come possa esistere un algoritmo one-pass con requisiti di spazio O (1).
TonyK,

2

Consiglio anche di leggere la sezione 8.1.3 "Estrazione frequente di pattern in flussi di dati" del seguente libro:

Jiawei Han, Micheline Kamber. Data mining --- Concetti e tecniche, Seconda edizione, Morgan Kaufmann Publishers , 2006.

Presenta un algoritmo, noto come Lossy Counting , che approssima gli oggetti frequenti (elementi il ​​cui supporto è al di sopra di qualche supporto minimo ) con precisione arbitraria.

Non esattamente quello che vuoi, ma ho pensato che potesse aiutare.


forse puoi aiutarmi sulla mia domanda qui
Ben
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.