Je cherchais l'algorithme le plus efficace (streaming ??) qui me dise les «k» éléments les plus fréquemment rencontrés dans un flux de données à tout moment. Cet article: Les algorithmes de flux de données "Diviser et conquérir" m'ont intéressé.
Par exemple, supposons qu'il y ait des nombres: (4,3,5,1,6,2,4,3,3,8,9,1) et que je recherche les 3 nombres les plus fréquents (disons), alors je devrais prenez (3,4,1) comme réponse.
J'ai essayé de chercher en ligne, mais je n'ai pas trouvé d'endroit qui donne une approche et dit que c'est le meilleur. Une solution triviale serait d'utiliser un tas ou un arbre binaire équilibré, mais je pense qu'il existe une meilleure façon et je voulais savoir si elle est documentée quelque part.
Edit: je recherche un algorithme qui donne toujours la bonne réponse par opposition à un algorithme d'appromixation (dont beaucoup apparaissent dans les résultats de recherche) qui repose sur la distribution des données d'une manière ou d'une autre
la source
Réponses:
Il existe une littérature abondante sur ce problème. Premièrement, même pour , le problème est difficile: comme le montrent Alon, Matias et Szegedy , vous ne pouvez pas obtenir une meilleure approximation factorielle constante de la fréquence de l'élément le plus populaire dans l' espace , même si vous sommes prêts à être randomisés.o ( n )k = 1 o ( n )
Cependant, si vous êtes assuré qu'un élément se produit strictement plus de 50% du temps, il existe une astuce simple qui utilise un espace constant et le trouvera (c'est une question de puzzle Google populaire). Plus généralement, vous pouvez trouver des éléments qui se produisent plus de fois en utilisant une généralisation de cette astuce.n / k
Une étude définitive de ce que l'on sait du problème est le document de Cormode et Hadjileftheriou de VLDB 2008 . Il couvre les méthodes ci-dessus et bon nombre des dernières méthodes. l'idée générale est que vous pouvez générer une liste approximative des premiers éléments (où approximative ici signifie que vous pourriez obtenir des éléments dont le nombre est proche du nombre des premiers éléments).kk k
la source
Je recommande également de lire la section 8.1.3 «Exploration de modèles fréquents dans les flux de données» du livre suivant:
Jiawei Han, Micheline Kamber. Exploration de données --- Concepts et techniques, deuxième édition, Morgan Kaufmann Publishers , 2006.
Il introduit un algorithme, connu sous le nom de Lossy Counting , qui rapproche les éléments fréquents (éléments dont le support est supérieur à un min_support ) avec une précision arbitraire.
Pas exactement ce que vous voulez, mais j'ai pensé que cela pourrait aider.
la source