2

我有一些需要有效存储和查找的数据。最好使用C。数据文件的每一行格式如下:

key1 key2 key3 data  

其中key1, key2,key3是整数并且data是 的数组float

我正在考虑将 key1,2,3 转换为字符串,然后使用 C++std::map将字符串映射到浮点指针:

std::map<string, float*>

有更好的方法吗?

注意:整数 key1,2,3 的范围为 0-4000,但人口稀少。换句话说,如果您遍历 key1 中的所有值,您会发现在 0-4000 范围内有 < 100 个唯一 int。

4

4 回答 4

5

您可以使用std::tuple将三个值合二为一:

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

散列提供了对数据的非常快速的访问,因此您可能希望使用散列从三个整数中的每一个中查找值。这种方法可以在 c 或 c++ 中使用。

对于每一行数据: 1. 为浮点数组分配空间 2. 将指向浮点数组的指针存储在指针数组中 3. 将指针数组的索引存储在基于 int1 的哈希中 4. 存储基于 int2 的散列中指针数组的索引 5. 将指针数组的索引存储在基于 int3 的散列中

这样,给定 int1、int2 或 int3,可以查找指针数组索引,检索指针,然后跟随指针指向浮点数组。这种方法使用一些内存,但不会太多,因为问题是 int1、int2 和 int3 中的每一个都有 < 100 个唯一值。

于 2012-08-11T03:56:05.263 回答