バックグラウンド
10Gデータがあり、その中に特定のデータがあるかどうかを調べます。しかし、メモリは2Gだけです。このデータが10Gデータに存在するかどうかを確認する方法。ブルームフィルターについてすぐに考える学生もいるかもしれません。そうです、ブルームフィルターは、ビットマップのアイデアから発展したより高度なデータ構造です。この記事では、主にビットマップの原理とアイデアについて説明します。
ビットマップ(ビットマップ)
前書き
- ビットは特定の値を表すために使用されます。つまり、データは保存場所によって表されます。
- ビットマップは特定の値を格納しませんが、アプリケーション内の値のデータフィンガープリントのみを格納します(インデックスグループの添え字にすることも、ハッシュ値によってマップされた配列の添え字を参照することもできます)。ビットマップを繰り返すことはできず、順序付けられます(具体的には、保存方法に従って、順序付けられたストレージが順序付けられ、ハッシュ計算が乱れます)
データの種類
- 最下層は配列を介して格納され、配列の各ビットはデータ値を表し、0はいいえを意味し、1ははいを意味します
- たとえば、1357のデータは、通常のストレージによると、intタイプは4ビットであるため、合計28ビットのメモリが必要です。ただし、ストレージにビットマップを使用する場合は、7ビットのみが必要です。使用されるストレージ方法は、配列の最初のシーケンシャルストレージです。 0から開始して、1はアレイの最初のスロットに配置され、1に設定されるため、保存後の構造は次のようになります。
保管方法
1.シーケンシャルストレージ
- 上記の例と同様に、並べ替えるデータのフィンガープリントとして配列の添え字を直接変更します。
- しかし、これには問題があります。つまり、保存されたデータが0からではなく、1000または10000から始まる場合です。または、これらのデータ間の間隔は非常に大きいですか?これらはすべて問題です。
2.ストレージのハッシュ計算
- javaでは、hashCode()、MD5などの計算を通じて、対応する配列添え字にハッシュします。ただし、ハッシュ後は特に大きな値になるので、自由に言って、対応する値の残りを計算することができます。たとえば
、長さが1024の空の配列の場合、格納されたデータのハッシュ値は1234567を1024で割った値であり、残りは647であるため、最終的には647の位置になります。同じデータが確実に同じ位置に配置されるため、ビットマップは繰り返されず、この場合は無秩序になります。
応用
1.毎日のアクティブユーザーを計算します
- 要求されたユーザーはハッシュ計算を実行し、残りの計算のために予算値で除算します。ビットが1のデータの量は、ユーザーの1日のアクティビティです。
2.ユーザーの再訪問統計、および2日間のbitMapが操作に使用されます
- 2日間の毎日のアクティビティデータを取得して計算すると、1はリピーターの数になります。
既存のホイール
- JDKのBitSetオブジェクト
https://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html - Redisビットマップの使用法(https://blog.csdn.net/u011957758/article/details/74783347)
総括する
- BitMapは、実際のデータを格納できないデータ値です。つまり、データが存在するかどうかを示すことしかできません。
- BitMapがデータを保存する方法は、保存場所に応じてデータを区別することです。保存場所が占有されているかどうかは、データが存在するかどうかを示します。
- 各保管場所は1ビットであり、これが本質であり、使用するスペースが少なくて済みます。
- ブルームフリッターも同じ考えです。特定のデータを複数回ハッシュし、固定長の配列を介してより多くの値を格納します。1つのデータが複数のスロットに対応します。詳細については、https://editor.csdn.net/md/?articleId = 108135235を参照してください。