Ich habe nach dem effizientesten (Streaming ??) Algorithmus gesucht, der mir die 'k' am häufigsten vorkommenden Elemente in einem Datenstrom zu einem beliebigen Zeitpunkt angibt. Dieser Beitrag: Algorithmen zum Teilen und Erobern von Datenströmen haben mich interessiert.
Angenommen, es gibt Zahlen: (4,3,5,1,6,2,4,3,8,9,1) und ich frage nach den 3 am häufigsten vorkommenden Zahlen (etwa), dann sollte ich bekomme (3,4,1) als Antwort.
Ich habe versucht, online zu suchen, konnte aber keinen Ort finden, der einen Ansatz bietet und sagt, dass dies der beste ist. Eine triviale Lösung wäre, einen Heap oder einen ausgeglichenen Binärbaum zu verwenden, aber ich denke, es gibt einen besseren Weg und ich wollte wissen, ob er irgendwo dokumentiert ist.
Bearbeiten: Ich bin auf der Suche nach einem Algorithmus, der immer die richtige Antwort liefert, im Gegensatz zu einem Genehmigungsalgorithmus (von dem viele in Suchergebnissen auftauchen), der auf die Verteilung von Daten in der einen oder anderen Weise angewiesen ist
quelle
Antworten:
Es gibt eine umfangreiche Literatur zu diesem Problem. Erstens, auch für , das Problem ist hart: als Alon, Matias und Szegedy zeigen, können Sie nicht besser als konstante Faktor Annäherung an die Frequenz des beliebtestenen Elements erhalten Raum, auch wenn Sie sind bereit, randomisiert zu werden.o ( n )k=1 o(n)
Wenn Sie jedoch sicher sind, dass ein Element in mehr als 50% der Fälle vorkommt, gibt es einen einfachen Trick, der konstanten Speicherplatz verwendet und diesen findet (dies ist eine beliebte Google-Rätselfrage). Ganz allgemein können Sie mit einer Verallgemeinerung dieses Tricks Elemente finden, die mehr als mal vorkommen.n/k
Eine endgültige Übersicht über das, was über das Problem bekannt ist, ist das Papier von Cormode und Hadjileftheriou aus der VLDB 2008 . Es werden die oben genannten und viele der neuesten Methoden behandelt. Die allgemeine Idee ist, dass Sie eine ungefähre Liste der Top- Elemente können (wobei ungefähre Angabe hier bedeutet, dass Sie möglicherweise Elemente erhalten, deren Anzahl in der Nähe der Anzahl der Top- Elemente liegt).kk k
quelle
Ich empfehle außerdem, Abschnitt 8.1.3 "Frequent-Pattern-Mining in Datenströmen" des folgenden Buches zu lesen:
Jiawei Han, Micheline Kamber. Data Mining --- Konzepte und Techniken, 2. Auflage, Morgan Kaufmann Publishers , 2006.
Es führt einen Algorithmus, wie bekannt Lossy Counting , die häufigen Elemente (Elemente , deren Unterstützung ist oberhalb einem approximiert min_support ) mit beliebiger Genauigkeit.
Nicht genau das, was Sie wollen, aber ich dachte, es könnte helfen.
quelle