L'algorithme P2 est une belle trouvaille. Il fonctionne en faisant plusieurs estimations du quantile, en les mettant à jour périodiquement et en utilisant une interpolation quadratique (non linéaire, non cubique) pour estimer le quantile. Les auteurs affirment que l'interpolation quadratique fonctionne mieux dans les queues que l'interpolation linéaire et que le cubisme deviendrait trop difficile et difficile.
Vous n'indiquez pas exactement comment cette approche échoue pour vos données "lourdes", mais il est facile de deviner: les estimations des quantiles extrêmes pour les distributions lourdes seront instables jusqu'à ce qu'une grande quantité de données soit collectée. Mais cela va être un problème (dans une moindre mesure) même si vous deviez stocker toutes les données, alors ne vous attendez pas à des miracles!
Quoi qu'il en soit, pourquoi ne pas définir des marqueurs auxiliaires - appelons-les et sein desquels vous êtes certain que le quantile se situera et stocker toutes les données situées entre et ? Lorsque votre tampon se remplira, vous devrez mettre à jour ces marqueurs, en conservant toujours . Un algorithme simple pour ce faire peut être conçu à partir d'une combinaison de (a) l'estimation P2 actuelle du quantile et (b) des comptages stockés du nombre de données inférieur à et du nombre de données supérieur à . De cette façon, vous pouvez, avec une grande certitude, estimer le quantile aussi bien que si vous aviez l'ensemble de données toujours disponible, mais vous n'avez besoin que d'un tampon relativement petit.x 6 x 0 x 6 x 0 ≤ x 6 x 0 x 6x0x6x0x6x0≤x6x0x6
Plus précisément, je propose une structure de données pour conserver des informations partielles sur une séquence de valeurs de données . Ici, est une liste chaînéen x 1 , x 2 , … , x n y(k,y,n)nX1, x2, … , Xny
y =( x( n )[ k + 1 ]≤ x( n )[ k + 2 ]≤ ⋯ ≤ x( n )[ k + m ]) .
Dans cette notation, désigne l' plus petite des valeurs lues jusqu'ici. est une constante, la taille du tampon . i th n x m yX( n )[ i ]jeen Xmy
L'algorithme commence par remplir avec les premières valeurs de données rencontrées et les placer dans l'ordre trié, du plus petit au plus grand. Soit le quantile à estimer; par exemple, = 0,99. En lisant il y a trois actions possibles: m q q x n + 1ymqqXn + 1
Si , incrémenter .Xn + 1< x( n )[ k + 1 ]k
Si , ne faites rien.Xn + 1> x( n )[ k + m ]
Sinon, insérez dans . yXn + 1y
Dans tous les cas, incrémentez .n
La procédure d' insertion place dans dans l'ordre trié, puis élimine l'une des valeurs extrêmes de : y yXn + 1yy
Si , alors supprimez de et incrémentez ;x ( n ) [ k + 1 ] y kk + m / 2 < n qX( n )[ k + 1 ]yk
Sinon, supprimez de . yX( n )[ k + m ]y
À condition que soit suffisamment grand, cette procédure mettra entre parenthèses le vrai quantile de la distribution avec une probabilité élevée. À tout stade il peut être estimé de la manière habituelle en termes de et , qui se trouvera probablement dans . (Je crois que ne doit être mis à l'échelle que comme la racine carrée de la quantité maximale de données ( ), mais je n'ai pas effectué d'analyse rigoureuse pour le prouver.) Quoi qu'il en soit, l'algorithme détectera s'il a réussi (par comparer et à ).n x ( n ) [ ⌊ q n ⌋ ] x ( n ) [ ⌈ q n ⌉ ] y m N k / n ( k + mmnX( n )[ ⌊ qn ⌋]X( n )[ ⌈ qn ⌉]ymNk / nq(k+m)/nq
Un test avec jusqu'à 100 000 valeurs, en utilisant et (le cas le plus difficile) indique que cet algorithme a un taux de réussite de 99,5% pour obtenir la valeur correcte de . Pour un flux de valeurs, cela nécessiterait un tampon de seulement deux millions (mais trois ou quatre millions seraient un meilleur choix). L'utilisation d'une liste triée à double lien pour le tampon nécessite = effort tout en identifiant et en supprimant le max ou le min sont des opérations . L'insertion relativement coûteuse doit généralement être effectuée uniquement q=0,5x ( n ) [ ⌊ q n ⌋ ] N=10 12m = 2 N--√q= 0,5X( n )[ ⌊ qn ⌋]N= 1012O(log(N))O(O( log( N--√) )O ( log( N) )O ( √O ( 1 )O ( N--√)fois. Ainsi, les coûts de calcul de cet algorithme sont dans le temps et dans le stockage.O( √O ( N+ N--√bûche( N) ) = O ( N)O ( N--√)