【问题标题】:C++ std::map vs dynamic arrayC++ std::map vs 动态数组
【发布时间】:2012-09-23 00:07:21
【问题描述】:

我正在尝试创建一个 3 维布尔数组,它告诉我是否以前访问过 3d 空间中的某个位置以进行简单的导航算法。该数组可能非常大(大约为 1,000,000 x 1,000,000 x 1,000,000 或更大),所以我想知道声明该大小的数组并将每个布尔值设置为 false 是否会更快,或者使带有坐标键 (x, y, z) 和 bool 类型值的地图。

据我所知,数组需要 O(1) 来查找或修改坐标,而地图需要 O(log n) 来查找或插入值。显然,对于访问值,数组更快。但是,这是否抵消了声明这样一个数组所需的时间?

谢谢

【问题讨论】:

  • std::unordered_map 平均为 O(1)
  • 为什么不使用哈希映射(C++11 中的unordered_map)?
  • 即使每个单元格只有一位,您也需要超过 10^11 GB 的内存用于阵列。您可能应该考虑一种更好的方法。
  • 速度是目前需要关注的错误优化。
  • 您希望在数组中设置多少个元素?如果您最终希望使用数组的紧凑表示来访问所有单元格(例如,每个单元格使用一位而不是 bool)可能是最好的方法。如果您希望访问路径,则集合或哈希集(std::unordered_set;您可以通过元素的存在来确定值)的较小内存占用可以抵消更好的访问模式。

标签: c++ map std time-complexity


【解决方案1】:

即使每个布尔值 1 位,您的数组也会占用 2**39 个字节。如果true 的元素不多,我建议使用set

您可以使用一个类来隐藏实现细节,并使用一维集。

【讨论】:

  • 这似乎是std::set 是理想数据结构的少数用例之一,因为您关心的只是“我来过这里吗?”。 “实现细节”类将有 3 个数据成员(x、y 和 z 坐标)并定义 operator <。根据您的用例,您可能需要的唯一其他东西是一个接受 x、y 和 z 坐标的构造函数,并且数据成员是私有的(如果您真正关心这些坐标的只是您是否去过那里)。
  • 这比 std::unordered_set 快吗?关于这一点,我一直无法弄清楚我需要在我的类中实现哪些函数(它只包含三个 int 值)以允许与 unordered_set 一起使用。
  • @VerTiGo_Etrex,std::setstd::unsorted_set 之间的速度差异将取决于您填充的元素数量和散列函数的质量。 std::set 需要 < 比较器,std::unordered_set 需要哈希函数和 == 比较器。
【解决方案2】:

您是否尝试过计算这样的数组需要多少内存?很多! 如果点的顺序很重要,则使用 std::map,否则使用 std::unordeded_map。此外,无序映射为您提供了恒定的时间插入和查找。 我猜你可能正在寻找某种搜索树(例如 k-d 树)。

【讨论】:

    【解决方案3】:

    假设每个点使用 8 位,您将创建一个 1 EB 的数组?哇,你有很多内存!

    我认为你应该重新考虑你的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-11
      • 2012-05-09
      • 2012-08-21
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多