math.stackexchangeから移行されました。
私は整数の長いストリームを処理していますが、多くのデータを保存せずにストリームのさまざまなパーセンタイルをおおよそ計算できるようにするために、しばらく追跡することを検討しています。数秒からパーセンタイルを計算する最も簡単な方法は何ですか。少量のデータのみを保存するより良いアプローチがありますか?
math.stackexchangeから移行されました。
私は整数の長いストリームを処理していますが、多くのデータを保存せずにストリームのさまざまなパーセンタイルをおおよそ計算できるようにするために、しばらく追跡することを検討しています。数秒からパーセンタイルを計算する最も簡単な方法は何ですか。少量のデータのみを保存するより良いアプローチがありますか?
回答:
これを明示的に述べることはありませんが、問題の説明から、高バイアスの分位セット(たとえば、50、90、95、99パーセンタイル)を求めているようです。
その場合、Cormodeらによる「データストリーム上のバイアスされた分位点の効果的な計算」で説明されている方法で多くの成功を収めました。これは、メモリをほとんど必要とせず、実装が簡単な高速アルゴリズムです。
この方法は、GreenwaldとKhannaによる以前のアルゴリズムに基づいており、サンプル内の値のランクの上限と下限とともに入力ストリームの小さなサンプルを維持します。いくつかの瞬間のコレクションよりも多くのスペースを必要としますが、分布の興味深い尾部領域を正確に記述するのにはるかに優れています。
極端な分位数の非常に優れた推定値を提供する、このためのより最近のはるかに単純なアルゴリズムがあります。
基本的な考え方は、データ構造のサイズを制限し、小さなまたは大きなに対してより高い精度を保証する方法で、より小さなビンが極端に使用されるということです。このアルゴリズムは、いくつかの言語と多くのパッケージで利用できます。MergingDigestバージョンは動的な割り当てを必要としません... MergingDigestがインスタンス化されると、それ以上のヒープ割り当ては不要です。