大型数据集的矢量替代方案?c++

Alternative to vectors for large data sets? C++

本文关键字:方案 c++ 数据集 大型      更新时间:2023-10-16

我正在寻找一种数据结构,它按其插入(如矢量)的顺序保存数据,需要保存数百万个无符号长。关键是它需要有一个比O(logn)更好的查找,因为它将针对相同大小的类似向量进行搜索。有这样的东西存在吗?

如果我插入10,20,30,然后遍历集合,我需要保证10,20,30的顺序。我的数据是一个字符串,我转换成一个unsigned long来减少内存使用,这是反向可解码的。

编辑:既然有人问了,我就把两个向量相互比较(两个向量的大小都很大)来得到差值。

小例子:

vector 1: 10 20 30 40 50 60
vector 2: 11 24 30 40 55 70 90
result:   30 40

我自己从未使用过它,与最近的c++版本功能相比,它可能已经过时了(上次更新是从2011年开始),但STXXL意味着一组容器和算法,为非常大的数据量而构建。它可能适合你的需要。

STXXL的核心是c++标准模板的实现库STL用于外部内存(核外)计算,即,STXXL实现了可以处理海量数据的容器和算法只能放在磁盘上的数据量。而与STL的接近度支持易用性和与现有应用程序的兼容性,另一个设计优先级是高性能。

STXXL的主要特性有:

  • 透明支持并行磁盘。该库提供了基本并行磁盘算法的实现。STXXL是唯一的支持并行磁盘的外部存储算法库。
  • 库能够处理非常大的问题(测试到几十tb)。
  • 提高了计算机资源的利用率。STXXL实现的外部内存算法和数据结构从中受益I/O和计算的重叠。
  • I/O体积中的小常数因子。一个称为"流水线"的独特库特性可以节省超过一半的I/o数量在算法组件之间流式传输数据,而不是临时的将它们存储在磁盘上。开发分支支持异步执行算法组件,支持高级任务并行。
  • 由于众所周知的外部内存算法和数据结构的stl兼容接口缩短开发时间。
  • STL算法可直接应用于STXXL容器;此外,在大多数情况下,算法的I/O复杂度保持最优在这些案例中。

对于内部计算,从MCSTL或libstdc++并行模式可选地利用,使算法从多核并行性中获益。

哈希映射是一种比排序向量更快的查找方式。你必须支持c++11才能使用它。
http://www.cplusplus.com/reference/unordered_map/unordered_map/
为了保持数据的顺序,唯一的方法是在它旁边保留一个同时存储整型数的向量
在开始使用它之前,您应该考虑如何使用该数据结构(访问模式)。还要考虑您可能获得的数据是什么。
下面是boost版本的相同内容http://www.boost.org/doc/libs/1_53_0/doc/html/unordered.html

我认为你应该使用unordered_map结合也许是一个双链表的顺序。

因此,每次向数据库添加新项时,您首先将其添加到链表的前面(或末尾),然后将其添加到哈希映射中,其中键是值(unsigned int),"值"(来自键/值对)是指向链表中对象的指针。所以现在如果你想快速查找,你就在哈希表中查找,如果你想按顺序迭代,你就用链表。当然,当你想要删除一个对象时,你必须从两个对象中删除它们,但从复杂度上讲,它是相同的(O(1)平摊到所有对象)。

与使用hashmap相比,这当然会增加2到3的内存

相关文章: