稀疏插入的数据结构

时间:2016-10-27 11:45:12

标签: c++ data-structures hashmap hashtable

我问这个问题主要是为了确认,因为我不是数据结构专家,但我认为适合我需要的结构是 hashmap

这是我的问题(我猜这是典型的?):

  • 我们正在研究大量对象之间的成对交互(比如说N = 90k),所以将存储看作稀疏矩阵;
  • 有一个过程,比如说(P),它从一个对象中随机开始,并计算一个可能导致另一个对象的模型:我不能提前预测对,所以我需要能够"创造"动态的条目(可以说这里的表现不是很关键);
  • 过程(P)可以重新访问"现有的对并更新矩阵中的相应元素:这种情况发生了很多,因此我需要能够尽快找到并更新。
  • 最后,过程(P)重复了数百万次,但只需要对数据结构进行写访问需要了解最新的& #34;状态"那个存储空间这直觉上就像一个可能被利用以提高性能的细节,但我不认为这是一个散列图。

这最后一点实际上是我的问题的主要原因:是否存在满足前三点的数据结构(我正在思考哈希映射,正确?),哪些也会利用最后一点提高性能的功能(我正在考虑缓冲操作并异步批量执行它们)?

编辑:我正在使用C ++,如果有一个现有的库实现该数据结构,我会更喜欢它。另外,我受系统要求的限制;我无法使用C ++ 11功能。

1 个答案:

答案 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来生成索引来加快速度。

如果几乎​​所有更新都转到了一小部分对,那么您可以有两张地图(smalllarge),并直接更新small地图。每当small的尺寸超过阈值时,您都可以更新large并清除small。你需要做一些仔细测试,看看这是否有帮助。我认为它可能有所帮助的唯一原因是改进了缓存局部性。

即使您最终使用不同的数据结构,也可以保留此类接口,其余代码将不受干扰。特别是,将sparsehash放入相同的结构将非常容易。