我问这个问题主要是为了确认,因为我不是数据结构专家,但我认为适合我需要的结构是 hashmap 。
这是我的问题(我猜这是典型的?):
这最后一点实际上是我的问题的主要原因:是否存在满足前三点的数据结构(我正在思考哈希映射,正确?),哪些也会利用最后一点提高性能的功能(我正在考虑缓冲操作并异步批量执行它们)?
编辑:我正在使用C ++,如果有一个现有的库实现该数据结构,我会更喜欢它。另外,我受系统要求的限制;我无法使用C ++ 11功能。
答案 0 :(得分:1)
我会使用类似的东西:
#include <boost/unordered_map.hpp>
class Data
{
boost::unordered_map<std::pair<int,int>,double> map;
public:
void update(int i, int j, double v)
{
map[std::pair<int,int>(i,j)] += v;
}
void output(); // Prints data somewhere.
};
这会让你前进(你可能需要声明一个合适的哈希函数)。您可以通过使密钥类型为64位整数并使用((int64_t)i << 32) | j
来生成索引来加快速度。
如果几乎所有更新都转到了一小部分对,那么您可以有两张地图(small
和large
),并直接更新small
地图。每当small
的尺寸超过阈值时,您都可以更新large
并清除small
。你需要做一些仔细测试,看看这是否有帮助。我认为它可能有所帮助的唯一原因是改进了缓存局部性。
即使您最终使用不同的数据结构,也可以保留此类接口,其余代码将不受干扰。特别是,将sparsehash放入相同的结构将非常容易。