序文
問題の紹介 順序付けされていない境界付き 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 疲労は 2 つの異なる概念のように聞こえるかもしれませんが、この 2 つ...
[51CTO.comからのオリジナル記事] Facebookは、インド政府および通信会社と協議し、太...
企業がより強力な管理を維持し、コストのかかる混乱を回避しようとする中、製造拠点の国内移転とサプライチ...
[51CTO.com からのオリジナル記事] IT 部門のステータスが一向に向上しないのはなぜか、上...
テクノロジーは私たちの生活に常に影響を与えています。社会として私たちはテクノロジーに大きく依存するよ...
この能力がアルゴリズムによって習得された後、AlphaGo は人間のチェスの名人を破り、OpenAI...
[[379724]]良好なコミュニケーションはビジネスを推進し、組織に戦略的に実装された人工知能 (...
3月23日から26日まで、2021年重大健康産業(重慶)博覧会と第6回双品会が重慶で開催されました。...
OpenAI はひっそりとその中核となる価値観を変えました。公式ウェブサイトに掲載されている6つのコ...
[[250312]]手のひらをスワイプするだけで入場や支払いができ、道路清掃車にセンサーを追加するこ...
Theano、Caffeに続き、大学主導のディープラーニングフレームワークがオープンソース化され、国...