2

効率的に保存して検索する必要があるデータがあります。できればCを使用してください。データファイルの各行は次の形式です。

key1 key2 key3 data  

ここkey1key2、、、key3は整数でdata、の配列ですfloat

key1,2,3 を文字列に変換してから、C++std::mapを使用して文字列を float ポインターにマップすることを考えています。

std::map<string, float*>

それを行うより良い方法はありますか?

注: 整数キー 1、2、3 の範囲は 0 ~ 4000 ですが、データは非常にまばらです。つまり、key1 のすべての値を調べると、0 ~ 4000 の範囲内で 100 個未満の一意の int が見つかります。

4

4 に答える 4

5

std::tuple3つの値を1つに結合するために使用できます。

std::map<std::tuple<int, int, int>, float *>
于 2012-08-11T01:41:48.413 に答える
2

各キーのデータ制限が 0 から 4000 の場合、文字列を使用する必要はありません

最初に、次のように結合キーを生成します。

unsigned long ulCombinedKey = key1 + key2<<12 + key3 <<24;

その後、質問ですでに述べたように、マップを使用できます。

于 2012-08-11T01:37:40.190 に答える
1

階層マップはそれを行います:

map<int, map<int , map<int, list<float> > > > records;

アクセス時間は良好です(対数)。範囲が非常に広い場合、この方法は効率的です。それ以外の場合、4000 の場合、前の回答で提案されたシフトの方が高速で効率的です。

于 2012-08-11T01:35:39.827 に答える
0

ハッシュはデータへの非常に高速なアクセスを提供するため、ハッシュを使用して 3 つの整数のそれぞれから値を検索することをお勧めします。このアプローチは、c または c++ のいずれかで使用できます。

データの各行について: 1. float の配列にスペースを割り当てます。 2. float の配列へのポインターをポインターの配列に格納します。 3. int1 に基づくハッシュにポインター配列のインデックスを格納します。 int2 に基づくハッシュ内のポインター配列のインデックス 5. int3 に基づくハッシュ内のポインター配列のインデックスを格納します。

このように、int1、int2、または int3 を指定すると、ポインター配列のインデックスを検索し、ポインターを取得し、ポインターをたどって浮動小数点数の配列に移動できます。int1、int2、および int3 のそれぞれに 100 個未満の一意の値があるという問題を考えると、このアプローチはいくらかのメモリを使用しますが、それほど多くは使用しません。

于 2012-08-11T03:56:05.263 に答える