【问题标题】:Vector or Map or Hash map for C++?C ++的向量或映射或哈希映射?
【发布时间】:2012-08-29 16:30:25
【问题描述】:

我有大量记录,比如大约 4,000,000 条,我想反复处理它们并将信息放入与该记录链接的类中。我不确定我应该使用什么样的数据结构?我应该使用向量、映射还是哈希映射。我不需要插入记录,但我需要读取一个包含这些记录编号(或名称)集的表,然后获取一些链接到该记录的数据并对它们进行一些处理。地图上的发现是否足够快以至于不能在这个例子中使用哈希图?记录有一个类作为它的结构,并且我之前没有做过任何使用以类作为其值的映射或哈希映射(如果可能的话)。 在此先感谢各位。

已编辑:

我暂时不需要将所有的记录同时保存在内存中> 我需要先给它一个结构,然后从一些记录中获取数据。记录总数约为 2000 万条,我想读取这些原始记录中的每一个,然后如果它的基本信息不存在于我想要创建的新地图或矢量中,并将其余数据作为一个向量。因为我有 2000 万条记录,我认为每条记录都要经过 400 万条记录才能找到该记录的基本信息是否存在,这将是非常痛苦的。我有大约 400 万个类型的包,每个包都可以有不止一种类型的服务(每个包大约 5 (20/4) 个)。我想读取这些记录中的每一个,然后如果包 ID 不存在到向量中或我想使用的任何内容中,然后将基本信息推送到向量中,然后将与该包相关的服务保存在向量中在包类里面。

【问题讨论】:

  • 这是一个很好的链接(其中一个):stackoverflow.com/questions/5139859/…。不管它值多少钱,听起来“地图”可能最适合您的需求。恕我直言...
  • 这里没有足够的细节来确定答案 - 这些结构中的任何一个都可能是合适的。您如何查找此列表中的记录?您是否需要一次将它们全部加载到内存中?你能详细说明一下用例吗?
  • 我不确定我是否理解您想要做什么。如果您可以简要列举您需要的所有操作,这可能会有所帮助......如果您想在固定大小的数据集上以最小的开销快速检索,请选择 std::array。如果大小是可变的,则选择 std::vector。如果您需要以某种方式订购的东西,请选择 std::map (如果 ID 可以出现多次,则选择 std::multimap )。如果不需要排序,也可以使用std::set,具体取决于数据的结构。
  • 您所描述的内容听起来像是关系数据库的工作。否则,考虑到您想要快速查找(用于“链接”记录彼此),您可能想要使用哈希表,即unordered_map
  • 不,我暂时不需要将所有的记录同时保存在内存中> 我需要先给出一个结构,然后从一些记录中获取数据。记录总数约为 2000 万条,我想读取这些原始记录中的每一个,然后如果它的基本信息不存在于我想要创建的新地图或矢量中,并将其余数据作为一个向量。因为我有 2000 万条记录,我认为每条记录都要经过 400 万条记录才能找到该记录的基本信息是否存在,这将是非常痛苦的。

标签: c++ map vector hashmap


【解决方案1】:

这三种数据结构各有不同的用途。

vector 基本上是一个动态数组,这对索引值很有用。

map 是一个排序数据结构,具有 O(log(n)) 检索和插入时间(使用平衡二叉树实现,通常是红黑)。如果您找不到有效的哈希方法,这是最好的。

hash_map 使用哈希来检索对象。如果您有一个定义良好且冲突率低的哈希函数,您将获得恒定的检索和插入时间平均hash_maps 通常比 map 快,但并非总是如此。高度依赖散列函数。

对于您的示例,我认为最好使用hash_map,其中键是记录号(假设记录号是唯一的)。

如果这些记录数密集(意味着索引之间的间隔很小或没有间隔 ,比如说:1,2,4,5,8,9,10...),你可以使用vector。如果您的记录来自具有自动增量主键且删除次数不多的数据库,则通常应该是这种情况。

【讨论】:

  • 我怎样才能知道这些类型使用的时间?例如,我尝试制作 100 万张简单的地图记录。当我使用 find() 函数时,它是实例。但他们说它的顺序为 O(log(n))。这对我来说没有意义。我试图搜索倒数第三个记录,但记录立即出现。如果这是 O(log(n)) 的顺序,那么它不应该是 log(1,000,000) 吗?
  • log(1,000,000) = 20,对于任何计算机来说都是一个瞬间。复杂性是一个广泛的主题,但基本上,当我们说操作顺序为 O(log(n)) 时,这意味着处理 x*x 对象所花费的时间是处理 x 对象所花费的时间的两倍。因此,例如,如果算法需要 10 秒来处理 1000 个项目,则只需 20 秒来处理 1000*1000 = 1000 000 个项目,而只需 40 秒来处理 1 000 000 000 000 个项目。这非常快。
  • 谢谢。减轻了我的负担。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2015-09-22
  • 2013-11-23
相关资源
最近更新 更多