配列内の数字の数

少しの背景。 この投稿は2つの目的で作成しました。 まず、Markdown + Markup Converterを実行します inline_formula 偶然のように。 第二に、データストリーミングの興味深いタスクについてお話しします。 執筆の終わりに向かって、私は4年前にLogLogに関する投稿を見つけました。 幸運なことに、前の投稿の著者は実装を強調しました。 私は、に依存しています inline_formula 数学について詳しく説明します。

ルーターがあると想像してみましょう。 多くのパケットがルーターを介して異なるアドレスに送られます。 通信に関与しているアドレスの数に関する統計を取得することに関心があります。 いくつかの問題があります。


いくつかのタイトル

チャレンジ整数のシーケンスがあります inline_formula 、すべての数値は inline_formula 前に inline_formula を使用して異なる数の数を数えるために1つのパスで必要です inline_formula メモリ

確率的近似Flageaulette-Martinアルゴリズムについて説明します。 TTXアルゴリズム:


投稿の最後に、正確な決定論的アルゴリズムが必要な理由を説明します inline_formula メモリ。

Flageaulette Martinアルゴリズム


実数のセグメントがあると想像してください inline_formula 。 セグメントでは、独立してランダムにスローします inline_formula 均一分布によるポイント。 左端の点とゼロの間の距離はどうなりますか?

点がセグメントを分割すると仮定することができます inline_formula ほぼ同じ長さの小さなサブセグメント。 距離の期待値を慎重に記述し、積分を取ると、


誰かが誤ってセグメントにいくつかのポイントを投げさせ、そして inline_formula -ゼロから左端の点までの距離。 注文の合計ポイントがあると推定できます inline_formula

Phagelet-Martinアルゴリズムの考え方は、シーケンス内のすべての数値をランダムにスローすることです inline_formula セグメントごと inline_formula そして、ゼロから左端の点までの距離を見つけます。 同じ番号が常に1つのポイントに表示され、異なる番号が間隔全体に独立して分布している場合、答えを見つけることができます。

2つの独立したハッシュ関数


ランダムハッシュ関数を使用して、セグメントに数値をスローします。

定義 ハッシュファミリー inline_formula いずれかの場合、2独立と呼ばれます inline_formula そして inline_formula


定義の意味は次のとおりです。 任意の2つのキーを修正します inline_formula そして inline_formula
キーは異なります。 ランダム変数を見てみましょう inline_formula そして inline_formula 。 ランダム性は、関数の選択によって決まります inline_formula 。 次に、定義により、数量 inline_formula そして inline_formula 独立して行動します。

その結果、キーを1つだけ取る場合 inline_formula その後、量 inline_formula 均等に分配されます inline_formula

たとえば、素数を取る inline_formula 。 させる inline_formulainline_formula すべての線形マッピングのモジュロです inline_formula


のために inline_formula 。 それから


以来 inline_formula 、システムには1つのソリューションがあります inline_formula 可能な:


2つの重要なポイントを理解します。 まず、そのような関数のコストを inline_formula メモリ、これは非常に少ないです。 第二に、よく見ると、フィールドで計算が行われていることがわかります。 inline_formula 、および任意の有限体に一般化できます。

テストコードでは、ガロア体を使用します inline_formula 。 以下の説明では、ハッシュ関数のファミリーがあると仮定できます。 inline_formula どこで inline_formula -二度。 1つの機能の保管にかかる inline_formula メモリ。

アルゴリズム


させる inline_formula -二度。
開始する前に、アルゴリズムはランダムにハッシュ関数を選択します inline_formula 2人の独立した家族から。

シーケンスの要素をセグメントにスローします inline_formula 。 次の価値を inline_formula 書き込み:ゼロ、ポイント、 inline_formula バイナリ形式。 たとえば、 inline_formula その後、我々は番号を取得 inline_formula

で示す inline_formula バイナリの先行ゼロの数 inline_formula 。 させる inline_formula 。 最小値は inline_formula そして inline_formula

アルゴリズムの答え: inline_formula

def init(): h = H.sample() z = 0 def process(a): z = max(z, zero(h(a)) def answer(): return 2**(z + 0.5) 

分析



アルゴリズムの応答は、真の応答よりも3倍大きく、確率が低いことを示すつもりです。 inline_formula 。 同様に、アルゴリズムは、真の確率の3倍小さい応答を返しますが、確率はより低くなります inline_formula 。 数学の詳細を学習する予定がない場合は、次のパートに進んでください。

で示す inline_formula すべての異なるシーケンス番号のセット inline_formula 、そして inline_formula -その数。

アルゴリズムを分析するには、2組の確率変数が必要です。


確率に注意してください inline_formula :値 inline_formula セグメント全体に均等に分散 inline_formula ; inline_formula -二度 すべて持っている inline_formula との数字 inline_formula 先行ゼロ。

だから期待 inline_formula 。 上からの分散を制限する


の分散は inline_formula 線形。 任意の2つ inline_formula そして inline_formula




以来 inline_formula そして inline_formula 独立した inline_formula 。 手段


また、 inline_formula 、量 inline_formula -2独立。

今、量を考えます inline_formula


させる inline_formula -最小数は次のとおりです inline_formula 。 イベント「アルゴリズムが必要なものの3倍の答えを与えた」は、イベントと同等です inline_formula そしてイベントに等しい inline_formulaマルコフ不等式を適用して、確率を制限します


させる inline_formula -最大数は次のとおりです inline_formula 。 同様に、「アルゴリズムが必要な回答の3倍少ない答えを出した」というイベントは、イベントと同等です inline_formula そしてイベントに等しい inline_formulaチェビシェフの不等式を適用すると、


最終和音:中央値


エラーを減らす方法を理解することは残っています。 アルゴリズムの答えが大きすぎる場合を考えてみましょう。 アルゴリズムを並行して実行する inline_formula 一度答えの中で中央値を返します。 もしそうなら inline_formula 、その後、アルゴリズムは、もう確率がないミスをします。 inline_formula 。 同様に、他の方向の誤差を制限すると、


中央値がこのように機能するのはなぜですか? チェルノフの不等式による。 ランダム変数を取得します inline_formula 。 価値 inline_formula アルゴリズムの応答が1の場合 inline_formula 逃げる inline_formula 。 このイベントの確率は0.52以上です。

中央値 inline_formula より多くのアルゴリズムが開始します inline_formula 、これは、アルゴリズムの少なくとも半分の時間がより大きな答えを与えたことを意味します inline_formula そして inline_formula 。 その後、 ヘフディング・チェルノフの不等式により


どこで inline_formula いくつかの定数です。 別のケースも同じように表示されます。

正確なアルゴリズムの下限


誰かが実際に1回のパスで異なる要素の正確な数を1回のパスで見つける決定論的アルゴリズムを思いついたと想像してみましょう。 このようなアルゴリズムは次を使用する必要があることを示します inline_formula メモリ。

たくさん取る inline_formula サイズ inline_formula そしてそれをシーケンスの始まりとして置きます。 アルゴリズムのこの部分をフィードし、そのメモリを調べます。

アルゴリズムメモリのみから、セット全体を抽出できます。 inline_formula 。 現在の状態で数値を入力すると inline_formula 、アルゴリズムの応答は変わりません。 もし inline_formula 、それから1ずつ増加します。したがって、各セットに inline_formula メモリの一意の状態と一致する必要があります。

のさまざまなサブセット inline_formula サイズ inline_formula について inline_formula 。 各セットをビット文字列と一致させたい場合は、 inline_formula

何を読む


  1. 「データベースアプリケーションの確率的カウントアルゴリズム」、Flajolet、Martin、1983、 link
  2. 「周波数モーメントを近似する空間の複雑さ」、Alon、Matias、Szegedy、1999、 link

Source: https://habr.com/ru/post/J263211/


All Articles