我应该使用哪种数据结构来达到我的目的
Which data structure should i use for my purpose?
我需要一个数据结构,就像一个地图,但每个键可能有多个值相关,但我需要得到所有值对应于一个键作为对象的数组。那么哪种数据结构最适合做这个。我不需要在数据结构中搜索,我只需要快速访问对应于特定键的所有值。我已经查看了std::multimap,但它没有返回特定键的所有值。那么我可能使用的c++中最好的数据结构是什么呢?
我需要一个像地图一样的数据结构,但是…
std::map<key, std::vector<value>>
8000万分是一个不错的选择,值得考虑其他选择。值得思考/实验/基准测试的包括:
稀疏直接索引…要做到这一点,你需要足够的内存,不仅是8000万个数据点,而是整个x/y/z空间,但可以做一个
[x][y][z]
查找来找到细胞id的向量-这显然是巨大的-是否可行或理想从你的问题描述中不清楚一个排序的向量…根据数据结构元素插入和查找的顺序/重叠,以及您是否可以负担得起
std::map
到std::vector
的压缩步骤-您可以对(x,y,z)值的std::vector
进行排序,然后由于vector
的连续内存使用,std::unordered_map<key, std::vector<value>>
…为1亿个桶容量调整尺寸应该会加快插入速度。这可能比其他选项更慢或更快……与稀疏索引相比,用于索引的内存页可能更少,但在连续内存上多于binary_search
,每次查找访问的内存页最少,但使用普通哈希技术,您将有效地命中随机(但可重复)哈希桶,即使x,y,z坐标只是略有不同,因此缓存命中可能比上述所有其他选项更糟糕。
binary_search
优于std::map
。实际的基准测试始终是最佳的调优方式,最好使用配置文件来确认成本是出于预期的原因。
@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::vector
的std::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));
您可能应该对程序进行基准测试,看看哪个容器更方便。
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 设计将引用元素移动到开头的数据结构.C++
- 我对数据结构、双向链表有一些问题
- googletest:测试太大的数据结构
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 遍历我的数据结构,并向其中输入随机值
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 我应该使用什么样的数据结构来实现UPGMA
- 插入特定的数据结构时,我在做错什么
- 我的数据结构的最佳序列化方法
- 默认情况下,使 std 的数据结构使用我现有的非静态哈希函数"hashCode()"
- 我需要一个像堆栈一样的数据结构,但具有随机访问,但是,我应该实现什么
- 为什么返回数据结构而不是指针弄乱了我的数据的完整性
- 如何将 0(且仅 0)转换为我的数据结构
- 这是一个具有基于数组的列表函数的数据结构项目,我似乎无法摆脱这个无限循环。
- 我什么时候需要一个无锁的数据结构来跨音频应用程序中的线程读取/写入数据
- 在我的神经网络程序中使用的最有效的数据结构是什么?我的程序需要动态分配吗?
- 我应该编写自己的数据结构来处理语义解析还是直接在编译器项目中使用STL
- C++:将自己结构的地址作为参数传递给pthread_create时出错:What覆盖了我的数据
- 我的数据结构出现了c++内存泄漏