c++ - 稀疏插入的数据结构

标签 c++ data-structures hashmap hashtable

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

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

  • 我们正在研究大量对象(比如 N=90k)之间的成对交互,因此将存储视为稀疏矩阵;
  • 有一个过程,比如 (P),它随机从一个对象开始,并计算出可能导致另一个对象的模型:我无法提前预测这些对,所以我需要能够动态地“创建”条目(可以说这里的性能不是很关键);
  • 过程 (P) 可能会“重新访问”现有对并更新矩阵中的相应元素:这种情况经常发生,因此我需要能够尽快找到并更新。
  • 最后,进程 (P) 重复了数百万次,但只需要对数据结构的写入权限,它不需要知道最新的“该存储的状态”。这在直觉上感觉像是一个可以被用来提高性能的细节,但我不认为 hashmaps 可以。

最后一点实际上是我在这里提出问题的主要原因:是否存在满足前三点的数据结构(我在想散列映射,对吗?),并且还可以利用最后一个特征来实现提高性能(我在想像缓冲操作和异步批量执行它们这样的东西)?

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

最佳答案

我会使用类似的东西:

#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.
};

这会让你继续下去(你可能需要声明一个合适的散列函数)。您可以通过将 key 类型设置为 64 位整数并使用 ((int64_t)i << 32) | j 来加快速度。做索引。

如果几乎​​所有更新都针对对中的一小部分,您可以有两个映射(smalllarge),并直接更新 small map 。每次的大小small通过了阈值,您可以更新 large清除small .您需要做一些仔细的测试,看看这是否有帮助。我认为它可能有帮助的唯一原因是改进缓存位置。

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

关于c++ - 稀疏插入的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40283798/

相关文章:

c++ - 为什么 CreateFile 返回无效句柄?

c++使用CRTP为variaidic模板中的每种类型创建纯虚拟重载

c - C语言中如何对结构体进行从小到大排序?

C++17 Using Class Template Argument Deduction 关于保存函数返回值的类型的指南

c++ - 我无法将一个 vector 分配给另一个 vector 。程序崩溃

c - 双链表在 C 中通过 ref 添加元素

java - 遍历对象列表且每个对象都有对象列表的优化方案

java - 为什么Java中的Set数据结构内部使用Map?

java - 使用键升序排序arraylist

java - 如何访问源自数据库的 ArrayList 内的 HashMap ?