この問題は、リザーバー サンプリングによって解決される問題と少し似ていますが、同じではありません。それもかなり興味深い問題だと思います。
大規模なデータセット (通常は数億の要素) があり、このデータセット内の一意の要素の数を推定したいと考えています。典型的なデータセットには、数個から数百万個の一意の要素が存在する場合があります。
もちろん、明らかな解決策は、遭遇した要素の実行中のハッシュセットを維持し、最後にそれらをカウントすることです。これにより、正確な結果が得られますが、全体をスキャンするときに潜在的に大量の状態を運ぶ必要があります。データセット (つまり、これまでに検出されたすべての一意の要素)。
残念ながら、私の状況では、これは私が利用できるよりも多くの RAM を必要とします (データセットが利用可能な RAM よりもはるかに大きい可能性はありません)。
スキャン中に比較的少量の状態を維持しながら、データセットを 1 回通過して最後に一意の要素数を推定できるようにする統計的アプローチがあるかどうか疑問に思っています。データセット。
アルゴリズムへの入力はデータセット (Java の用語では反復子) であり、推定された一意のオブジェクト数 (おそらく浮動小数点数) を返します。これらのオブジェクトはハッシュできる (つまり、必要に応じて HashSet に入れることができる) と見なされます。通常、それらは文字列または数値になります。