Algoritmo para 'k' 'números más frecuentes

19

He estado buscando el algoritmo más eficiente (transmisión ??) que me dice los elementos 'k' que ocurren con mayor frecuencia en un flujo de datos en cualquier momento. Esta publicación: Los algoritmos de flujo de datos "Divide y vencerás" me interesaron.

Por ejemplo, supongamos que hay números: (4,3,5,1,6,2,4,3,3,8,9,1) y consulto los 3 números más frecuentes (por ejemplo), entonces debería obtener (3,4,1) como respuesta.

Intenté buscar en línea, pero no pude encontrar ningún lugar que ofrezca un enfoque y diga que es lo mejor. Una solución trivial sería usar un montón o un árbol binario equilibrado, pero creo que hay una mejor manera y quería saber si está documentado en alguna parte.

Editar: estoy buscando un algoritmo que siempre dé la respuesta correcta en lugar de un algoritmo de aplicación (muchos de los cuales aparecen en los resultados de búsqueda) que dependen de la distribución de datos de una manera u otra

dhruvbird
fuente
En realidad, hay tres tipos de algoritmos: exactos, aproximados y "dependientes de los datos". Descartó el último tipo, pero ¿son permisibles los algoritmos aproximados que NO dependen de la distribución de datos? como indiqué, si no, está en problemas debido a los límites inferiores conocidos para este problema en una configuración de transmisión.
Suresh Venkat
1
Tenía curiosidad por saber si los algoritmos que usan memoria limitada (algoritmos de transmisión) realmente pueden hacer lo que quería y parece que no pueden, como usted ha señalado. Además, si se conoce un algoritmo exacto sin transmisión que resuelva el problema en O (n), se garantiza el peor de los casos, que se menciona aquí (citado por el artículo de Cormode y Hadjileftheriou desde el enlace que proporcionó): citeseerx.ist.psu. edu / viewdoc / summary? doi = 10.1.1.106.7889
dhruvbird

Respuestas:

20

k=1o(norte)

norte/ /k

kk

Suresh Venkat
fuente
1
+1. Creo que el> 50% del algoritmo de tiempo es un bien conocido (algoritmo de elementos mayoría) como usted ha mencionado
dhruvbird
2
¡¡Gracias!! El documento de Cormode y Hadjileftheriou que mencionó cita este documento: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.106.7889 que tiene la misma técnica en la que estaba pensando. Mantiene 2 listas enlazadas; uno por frecuencia y dentro de él otra lista de todos los elementos con la misma frecuencia.
dhruvbird
¿Puedes elaborar el algoritmo de más del 50 por ciento? y el rompecabezas de google? No puedo seguir este razonamiento descuidado ya que lo acabas de mencionar y no gastaste completamente en "el truco bien conocido". Gracias.
Aquí hay un enlace: userweb.cs.utexas.edu/users/misra/scannedPdf.dir/…
Suresh Venkat
Este es un comentario (no hay suficiente reputación) en el enlace userweb.cs.utexas.edu/users/misra/scannedPdf.dir/… de Suresh Venkat : Parece que el algoritmo presentado allí requiere un segundo paso por los datos, lo que no está permitido aquí. De hecho, no veo cómo puede existir un algoritmo de una pasada con requisitos de espacio O (1).
TonyK
2

También recomiendo leer la sección 8.1.3 "Minería de patrones frecuentes en flujos de datos" del siguiente libro:

Jiawei Han, Micheline Kamber. Minería de datos --- Conceptos y técnicas, segunda edición, Morgan Kaufmann Publishers , 2006.

Introduce un algoritmo, conocido como Conteo con pérdida , que se aproxima a elementos frecuentes (elementos cuyo soporte está por encima de un mínimo de soporte ) con precisión arbitraria.

No es exactamente lo que quieres, pero pensé que podría ayudar.

MS Dousti
fuente
tal vez me puedan ayudar en mi pregunta aquí
Ben