2つの大きなキー値リストの推移的クロージャを実行したい。そうするために、私は2つの "std :: map"を持っています。両方のstd :: mapは整数を整数のベクトルに写像します。効率的に大規模な参照を検索する方法:: map
std::map<unsigned,vector<unsigned> > mapIntVecOfInts1;
std::map<unsigned,vector<unsigned> > mapIntVecOfInts2;
"mapIntVecOfInts1は、" キー(VALUES)の別のセットにキーをマッピング。その中の一例値のいくつかは、以下の形式です:
0 -> (101, 102, 201)
1 -> (101, 102, 103, 203, 817, 1673)
2 -> (201, 829, 858, 1673)
「mapIntVecOfInts2は、」値の別のセットに「mapIntVecOfInts1」に存在する値をマッピングします。例えば
101 -> (4002, 8293, 9000)
102 -> (4002, 8293, 10928)
103 -> (8293, 10928, 19283, 39201)
201 -> (8293)
203 -> (9393, 9830)
817 -> (19393, 19830)
1673-> (5372, 6830)
は今、私は「mapIntVecOfInts2」に「mapIntVecOfInts1」から推移マッピングを使用して、「mapIntVecOfInts2」に存在する値に「mapIntVecOfInts1」に存在するキーをマップします。例えば。私はmapIntVecOfInts1のキー「0」のために次の操作を実行したい:
0 -> 4002, 9000, 10928, 8293, 19283, 39201
1 -> 4002, 8293, 9000, 10928, 19283, 39201, 9393, 9830, 19393, 19830, 5372, 6830
「mapIntVecOfInts1」と「mapIntVecOfInts2は」億の要素(キー)を含有します。 2つのマップ自体のベクトルには、符号なし整数が100万個含まれています。私は "mapIntVecOfInts1"と "mapIntVecOfInts2"をメモリに格納することによって、2つのマップ間でこの推移的閉包を実行しようとしました。次のコードを使用します。
ただし、この方法で推移的閉包を実行するには、時間がかかります。私はこれをスピードアップできる方法がありますか?
それぞれのマップに 'unsigned'キーを持つ10億のエントリがあるとすれば、なぜ' map'の代わりに 'vector'を使用していないのですか? 64ビットシステムであっても、あなたのマッピングはあまり疎ではありません。 – Peter
@Peter Thanks Peter私はベクトルとstd :: lower_boundをルックアップに使用しようとしましたが、かなりの時間を費やしています。 –
@Peter彼はベクトルをソートするか、独自のバイナリ検索を実装する必要があります。 –