0

いくつかの単語について、HashMultimap (Guava) を呼び出して整数のセットを取得するという問題に直面しています。結果のセットには、たとえば、それぞれ 10、200、および 600 の項目があります。これらの 3 つ (または 4 つ、または 5 つ...) のセットの交差を計算する必要があり、このプロセス全体を何度も繰り返す必要があります (単語のセットが多数あります)。ただし、私が経験しているのは、平均して、これらのセットの交差の計算に非常に長い時間がかかる (0 から 300 ミリ秒) ため、何十万もの単語セットを見ると、プログラムの完了に非常に長い時間がかかることです。

特に(ソート可能な)整数を扱っている場合、これを達成するための実質的により迅速な方法はありますか?

どうもありがとう!

4

3 に答える 3

7

セットをビットの配列(ビットマップ)として表すことができる場合は、それらをAND演算と交差させることができます。これを実装して並行して実行することもできます。

例として(jlordoの質問を使用):set1が{1,2,4}で、set2が{1,2,5}の場合

次に、最初のセットは000010110(1、2、および4に設定されたビット)として表されます。2番目のセットは00100110(1、2、および5に設定されたビット)として表されます。

それらを一緒にANDすると、次のようになります。00000110(1と2に設定されたビット)

もちろん、整数の範囲が広い場合は、より多くのバイトが必要になります。ビットマップインデックスの利点は、可能な要素ごとに1ビットしか使用しないため、占有するスペースが比較的小さいことです。

たとえば、Javaでは、BitSetデータ構造を使用できます(ただし、並列操作を実行できるかどうかはわかりません)。

于 2013-01-15T11:54:41.603 に答える
1

ビットマップベースのソリューションの問題の1つは、セット自体が非常に小さいが、非常に大きな数(または無制限)が含まれている場合でも、ビットマップのチェックは非常に無駄になることです。

別のアプローチは、たとえば、2つのセットをソートし、それらをマージして、重複をチェックすることです。これは、セットサイズがO(n)の場合、O(nlogn)時間計算量と追加のO(n)空間計算量で実行できます。

問題の説明(入力範囲、予想されるセットサイズなど)に一致するソリューションを選択する必要があります。

于 2013-01-15T12:21:54.793 に答える