序文
問題の紹介 順序付けされていない境界付き int 配列 {1,2,5,7} があり、これは 44=16 バイトのメモリを占有すると推定されています。数字は 4 つしかないため、必要な数字をすばやく見つけるのは簡単です。しかし、そのような数字が 10 億個あり、重複もソートもされていない unsigned int 整数が 10 億個ある場合、整数が与えられたら、どうしますか? 要件分析: Java の Int 型のストレージは 4 バイト、32 ビットを占有します。 10億4/(102410241024)=約3.72G。これだけ大量のデータを検索・ソートすると、メモリが破綻してしまうでしょう。このデータは一度に読み込む必要はなく、保存する必要があり、保存すると必然的にIOを消費してしまうという意見もあります。当社は高パフォーマンスを重視しているため、このソリューションはまったく考慮されていません。
問題分析 BitMap の考え方を使って解決すれば、はるかに良い結果が得られます。では、BitMap はどのように解決するのでしょうか? 次のようにします。 1 バイトは 8 ビットを占めます。各ビットの値が存在するか存在しないか、つまり 2 進数で 0 または 1 の場合、ビットの位置が配列値の有無を表す場合、0 は値が現れていないことを意味し、1 は配列値が出現したことを意味します。データも記述できないのでしょうか?詳細は以下の通りです。 すごいと思いませんか? 10億のデータに必要なスペースが3.72G/32だとすると、32ビットを占めるデータは1ビットしか占めなくなり、ソートはもちろんのこと、多くのスペースを節約できます。すべてがとてもスムーズに思えます。このようなデータには相関関係はありません。読み取りたい場合は、マルチスレッドを使用して読み取ることができます。時間の計算量も O(Max/n) です。ここで、Max は byte[] 配列のサイズ、n はスレッド サイズです。 3. アプリケーションとコード BitMap がこれだけの機能しか持っていないと、エレガントさが足りない気がします。これからもその魅力を味わい続けていきましょう。次の計算アイデアは、実際にはビットの論理演算によって得られます。この種の論理演算に類似したアプリケーション シナリオは、権限計算で使用できます。 コードを見る前に、まず 1 つの問題を明確にしましょう。それは、数値のインデックス番号をすばやく見つける方法、つまり、byte[index] のインデックスが何であり、それがどの位置であるかを調べる方法です。例えば、add(14)。 14はbyte[0]のマッピング範囲外であり、byte[1]の範囲内にあります。では、そのインデックスを素早く見つけるにはどうすればよいでしょうか?インデックス番号を見つけたら、どうやって見つけるのでしょうか? Index(N)はNのインデックス番号を表し、Position(N)はNの位置番号を表します。
(1) 加算(int 数値) ビットマップにデータを追加したい場合はどうすればいいでしょうか? 心配しないでください。非常にシンプルで魔法のような方法です。上記で分析したように、add の目的は位置を 0 から 1 に変更することです。他の位置は変更されません。 コード例:
(2) クリア(int num) 1 を左にシフトし、それを否定し、最後に byte[index] と AND します。 コード例:
(3) 含む(int 数値) コード例:
完全なコードは次のとおりです。
要約: ビットマップの典型的な応用シナリオは、大量のデータの高速ソート、検索、重複排除です。 これはデータベースや検索エンジンで広く使用されており、ビットレベルの並列処理を利用することでクエリを大幅に高速化できます。 ただし、ビットマップ インデックスは大量のメモリを消費する可能性があるため、圧縮されたビットマップ インデックスを使用することをお勧めします。 それだけです。 |
<<: 避けられないアルゴリズムを完全に理解するにはどうすればよいでしょうか?
>>: 「三銃士」グループは、鉱業の諜報活動への発展を促進するためにデビューしました
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
[[426034]]この記事では、計算量、パラメータ数、メモリアクセス量、メモリ使用量など、ディープ...
生体認証技術は、市場に登場した最新の AI イノベーションのおかげで、特に 2021 年には長年にわ...
[[357046]]序文「三国殺し」は、中国の三国時代を背景に、身分を手がかりにカードを形にした人...
最近、「Honhe AI、生活をより良くする--Honheグループ2019年新製品発表会」が成都で開...
現在、DETR モデルはターゲット検出の主流のパラダイムとなっています。しかし、DETRアルゴリズム...
マイクロソフトの最新の研究は、迅速なエンジニアリングの力を再び証明しています——追加の微調整や専門家...
昨日の人工知能プロジェクトに関する 10 の提案 - 理論に続き、今日は人工知能プロジェクトの 10...
[[425172]]南洋理工大学と香港中文大学の研究者らは、ユーザーとシステム間の対話を通じてきめ...
2019年10月26日、Testinが主催する第2回NCTS中国クラウドテスト業界サミットが北京で開...