P2 algoritması güzel bir keşif. Kuantiliğin birkaç tahminini yaparak, periyodik olarak güncelleyerek ve kuvantili tahmin etmek için ikinci dereceden (doğrusal değil, kübik değil) enterpolasyon kullanarak çalışır. Yazarlar ikinci dereceden enterpolasyonun kuyruklarda doğrusal enterpolasyondan daha iyi sonuç verdiğini ve kübiklerin çok telaşlı ve zor olacağını iddia ediyorlar.
Bu yaklaşımın "ağır kuyruklu" verileriniz için tam olarak nasıl başarısız olduğunu belirtmezsiniz, ancak tahmin edilmesi kolaydır: ağır kuyruklu dağıtımlar için aşırı miktar tahminleri, büyük miktarda veri toplanana kadar kararsız olacaktır. Ancak tüm verileri saklasanız bile bu bir problem olacak (daha az ölçüde), bu yüzden mucizeler beklemeyin!
Her halükarda, neden yardımcı belirteçleri ayarlamıyorsunuz - onlara ve x 6 diyelim - kuantillerin yatacağı konusunda kesinlikle eminiz ve x 0 ile x 6 arasında kalan tüm verileri saklayalım ? Tamponunuz dolduğunda, bu işaretleri daima güncellemelisiniz, daima x 0 ≤ x 6 tutunuz . Bunu yapmak için basit bir algoritma, (a) miktarın mevcut P2 tahmini ve (b) x 0'dan küçük veri sayısının ve x 6'dan büyük veri sayısının depolanan sayılarının bir kombinasyonundan oluşturulabilir.x0x6x0x6x0≤x6x0x6. Bu şekilde, kesin olarak, tüm veri kümesini her zaman kullanılabilir durumda tuttuğunuz gibi miktarını da tahmin edebilirsiniz, ancak yalnızca nispeten küçük bir tampon belleğe ihtiyacınız vardır.
Spesifik olarak, bir veri yapısı teklif am bir dizi ilgili kısmi bilgiler sağlamak için , n veri değerleri X 1 , x 2 , ... , x , n . Burada, y bağlantılı bir listedir(k,y,n)nx1,x2,…,xny
y =( x( n )[ k + 1 ]≤ x( n )[ k + 2 ]≤ ⋯ ≤ x( n )[ k + m ]) .
Bu gösterimde O anlamına gelir i inci küçük n x değerleri kadar okuyun. m sabittir, tamponun boyutu y .x( n )[ i ]benincin xmy
Algoritma, , karşılaşılan ilk m veri değerleriyle doldurularak ve bunları en küçükten en büyüğe doğru sıralanmış sırayla yerleştirerek başlar. Q tahmin edilecek nicelik olsun ; örneğin, q = 0.99. X n + 1 okunması üzerine üç olası eylem vardır:ymqqxn + 1
Eğer , k değerini artırın .xn + 1< x( n )[ k + 1 ]k
Eğer ise hiçbir şey yapmayın.xn + 1> x( n )[ k + m ]
Aksi takdirde, sokma içine y .xn + 1y
Herhangi bir durumda, bu artış .n
Sokma prosedürü koyar içine y sıralanmış sırayla ve aşırı değerlerinden biri ortadan kaldırır y :xn + 1yy
Eğer , x ( n ) [ k + 1 ] 'i y'den kaldırın ve k değerini artırın ;k+m/2<nqx(n)[k+1]yk
Aksi takdirde, ' yi y'den kaldırın .x(n)[k+m]y
Sunulmuştur yeterince büyük, bu prosedür yüksek olasılıkla dağılım gerçek quantile ayraç. Herhangi bir aşamasında , n o açısından bilinen şekilde tahmin edilebilir x ( n ), [ ⌊ q n ⌋ ] ve x ( n ) [ ⌈ q n ⌉ ] olası uzanacaktır, y . ( M'nin yalnızca maksimum veri miktarının karekökü gibi ölçeklenmesi gerektiğine inanıyorum ( Nmnx(n)[⌊qn⌋]x(n)[⌈qn⌉]ymN), Ancak kanıtlamak için sıkı bir analiz gerçekleştirilmiştir değil.) Herhangi bir oranda, algoritma karşılaştırarak (başarılı olup olmadığının tespit edecektir ve ( k + m ) / n için q ).k/n(k+m)/nq
M = 2 √ kullanarak 100.000 değere kadar test veq=.5(en zor durumda) bu algoritma doğru değerini elde etmek için bir% 99.5 başarı oranına sahip olduğunu gösterir x ( n ) [ ⌊ q n ⌋ ] . Bir akışı için, N=10 12 değerleri, yani, (daha iyi bir seçim olacaktır ama üç ya da dört milyon), sadece iki milyon tampon gerektirir. Arabellek için sıralı olarak bağlantılı bir liste kullanmakOgerektirir(log( √m=2N−−√q=.5x(n)[⌊qn⌋]N=1012=O(log(N))eforu belirlerken ve silerken maksimum veya minO(1)işlemleridir. Nispeten pahalı yerleştirme tipik olarak sadeceO( √) yapılmalıdır.O(log(N−−√))O(log(N))O(1)kere. Dolayısıyla bu algoritmanın hesaplama maliyetleriO(N+ √O ( N--√)veO( √O ( N+ N--√günlük( N) ) = 0 ( N)depoda.O ( N--√)