これが私の問題の定義です。それぞれラベルを含む700 万個の indexの配列があります。簡単にするために、私が扱っている配列の例を次に示します: [1 2 3 3 3 5 2 1 7]。
この配列を調べる必要があり、ラベルに出くわすたびに、ラベルの場所を同じラベルの他のすべての「セット」に入力します。配列が非常に大きいため、任意の時点で特定のラベルの場所にのみアクセスしたいので、たとえば、3 の場所にのみアクセスし、それらの場所を処理して 5 に変更したいとしますが、もっとやりたい1回の操作だけでなく、すべてのラベルで個別に実行したい. 私の例のような小さな配列では、配列に固執するだけで簡単に思えます。ただし、700 万点の配列があるため、ラベルの検索を完了してから操作するには、はるかに時間がかかります。
混乱を解消するために、私の例を使用して、例の配列で次のようにします。
- 0 と 7 を含むセットにマップされた 1
- 1 と 6 を含むセットにマッピングされた 2
- 2、3、および 4 を含むセットにマップされた 3
- 5 を含むセットにマッピングされた 5
もともと、私は元の配列で処理を行い、単に配列を操作していました。これには、各ラベルに対応するインデックスの数を決定するのに約 30 秒かかりました (したがって、1 のサイズは 2、6 のサイズは 2、3 のサイズは 3 などであると判断できました。しかし、そうではありませんでした。このメソッドを使用して前記ラベルの位置を生成します. したがって、参照されたラベルのすべてのインデックスを見つけたら終了を追加することで高速化されましたが、各ラベルの位置を見つける残りの処理全体で時間が追加されました. 、検索を停止します。
次のステップでは、を使用しましたmap<int,set<int>>
が、これにより最終的に時間が 100 秒まで増加しましたが、後の処理時間は短縮されましたが、時間の大幅な増加を正当化するのに十分ではありませんでした。
まだ実装していませんが、追加のステップとして、ラベルに対応するインデックスを使用してセットの配列を初期化し、このメソッドを実行しようと計画しています。
hash_maps も試してみましたが、役に立ちませんでした。Unordered_sets と unordered_maps は Visual Studio 2005 の STL に含まれていないため、これら 2 つの構造で上記を実装していません。
キーポイント: 最大ラベルを認識し、すべてのラベルが連続するように配列を前処理しました (最小ラベルと最大ラベルの間にギャップはありません)。ただし、元の配列ではランダムに分散しています。これは、セットサイズのデータ構造の初期化に役立つ場合があります。ラベルに対応するインデックスの順序は重要ではありません。指定されたデータ構造内のラベルの順序も重要ではありません。
編集:背景として、配列はバイナリ イメージに対応し、バイナリ シーケンシャル ラベル付けを実装して、すべてのバイナリ blob にラベルが付けられた UINT16 のバイナリ イメージと同じサイズの配列を出力しました。ここでやりたいことは、各ブロブを構成するポイントのマップをできるだけ効率的に取得することです。