我应该使用哪种数据结构来达到我的目的

Which data structure should i use for my purpose?

本文关键字:我的 数据结构 我应该      更新时间:2023-10-16

我需要一个数据结构,就像一个地图,但每个键可能有多个值相关,但我需要得到所有值对应于一个键作为对象的数组。那么哪种数据结构最适合做这个。我不需要在数据结构中搜索,我只需要快速访问对应于特定键的所有值。我已经查看了std::multimap,但它没有返回特定键的所有值。那么我可能使用的c++中最好的数据结构是什么呢?

我需要一个像地图一样的数据结构,但是…

std::map<key, std::vector<value>>

8000万分是一个不错的选择,值得考虑其他选择。值得思考/实验/基准测试的包括:

  • 稀疏直接索引…要做到这一点,你需要足够的内存,不仅是8000万个数据点,而是整个x/y/z空间,但可以做一个[x][y][z]查找来找到细胞id的向量-这显然是巨大的-是否可行或理想从你的问题描述中不清楚

  • 一个排序的向量…根据数据结构元素插入和查找的顺序/重叠,以及您是否可以负担得起std::mapstd::vector的压缩步骤-您可以对(x,y,z)值的std::vector进行排序,然后由于vector

  • 的连续内存使用,binary_search优于std::map
  • std::unordered_map<key, std::vector<value>>…为1亿个桶容量调整尺寸应该会加快插入速度。这可能比其他选项更慢或更快……与稀疏索引相比,用于索引的内存页可能更少,但在连续内存上多于binary_search,每次查找访问的内存页最少,但使用普通哈希技术,您将有效地命中随机(但可重复)哈希桶,即使x,y,z坐标只是略有不同,因此缓存命中可能比上述所有其他选项更糟糕。

实际的基准测试始终是最佳的调优方式,最好使用配置文件来确认成本是出于预期的原因。

@TonyD的答案当然很好,但是与

相比,有一些权衡
std::multimap<key, value> 

搜索给定键的所有值应该得到相同的O(log N)复杂度

auto result = my_multimap.equal_range(my_key);

迭代仍然是O(N)复杂度:

for (auto it = result.first; it != result.second; ++it)
     // bla

然而,在所有真实世界的std::multimap实现中,上述迭代是在"连续"值元素上进行基于节点的指针追逐,而不是基于std::vectorstd::map连续迭代。这可能是因为cache-locality的原因。

我可以从std::vector解决方案中看到的主要缺点是,您正在提交以保持所有值在一起,这可能会带来一些开销,这取决于您复制数据的频率。

multimap方法也使得从容器

中插入/提取单个值变得更加容易
my_multimap.insert(std::make_pair(some_key, another_value);

auto it = my_map.find(some_key);
if (it != my_map.end()) 
    it->second.push_back(another_value);
else
    my_map.insert(std::make_pair(some_key, another_value));

您可能应该对程序进行基准测试,看看哪个容器更方便。

相关文章: