我正在寻找一种数据结构,它保存数据,以便插入(如矢量)需要保存数百万个无符号长整数。关键是它需要具有比O(logn)更好的查找,因为它将针对相同大小的类似向量进行搜索。有没有像这样存在的东西?
如果我插入10,20,30然后遍历集合,我需要保证10,20,30的顺序。我的数据是一个字符串我转换成无符号长以减少内存使用,即反向解码。
编辑: 由于人们在问,我正在比较两个向量(两者都非常大)以获得差异。
小例子:
vector 1: 10 20 30 40 50 60
vector 2: 11 24 30 40 55 70 90
result: 30 40
答案 0 :(得分:4)
我自己从未使用它,并且与最近的C ++版本功能相比可能已经过时了(最后一次更新是从2011年开始),但是STXXL是为一组容器和算法构建的。大量的数据。 它可能符合您的需求。
STXXL的核心是C ++标准模板的实现 用于外部存储器(核外)计算的库STL,i。即, STXXL实现可以处理巨大的容器和算法 只适合磁盘的数据量。虽然接近STL 支持易用性和与现有应用程序的兼容性, 另一个设计优先事项是高性能。
STXXL的主要特点是:
- 并行磁盘的透明支持。该库提供了基本并行磁盘算法的实现。 STXXL是唯一的 支持并行磁盘的外部存储器算法库。
- 该库能够处理非常大的问题(测试高达几十TB)。
- 提高计算机资源的利用率。外部存储器算法和数据结构的STXXL实现受益 I / O与计算重叠。
- I / O量中的小常数因子。一个名为“流水线”的独特库功能可以节省超过I / O数量的一半 算法组件之间的流数据,而不是临时的 将它们存储在磁盘上。开发分支支持异步 执行算法组件,启用高级任务 平行度。
- 由于外部存储器算法和数据结构的众所周知的STL兼容接口,缩短了开发时间。
- STL算法可以直接应用于STXXL容器;此外,算法的I / O复杂性在大多数情况下仍然是最佳的 这些案件。
对于内部计算,来自MCSTL的并行算法 可选地使用libstdc ++并行模式,制作算法 本质上受益于多核并行性。
答案 1 :(得分:1)
哈希映射是一种比排序向量更快查找的方法。您必须具有c ++ 11支持才能使用它
http://www.cplusplus.com/reference/unordered_map/unordered_map/
为了保持数据的顺序,唯一的方法是在它旁边维护一个存储int的向量
在您开始使用它之前,您应该考虑如何使用此数据结构(访问模式)。还要考虑您将获得的数据可能是什么
这是同一件事http://www.boost.org/doc/libs/1_53_0/doc/html/unordered.html
答案 2 :(得分:0)
我认为您应该使用的是unordered_map以及可能是订单的双向链接列表。
因此,每次向数据库添加新项时,首先将其添加到链表的前端(或末尾),然后将其添加到键值为(unsigned int)的hashmap中, “值”(来自键/值对)是指向链表中对象的指针。 所以现在如果你想要快速查找,你可以查看hashmap,如果你想按顺序迭代,你可以使用链表。 当然,当你想删除一个对象时,你必须从两者中删除它们,但复杂性方面它是相同的(O(1)为所有东西摊销)。
与使用hashmap相比,这当然会使你的内存增加2或3。