【问题标题】:Effective data structure for both deleteMin and search by key operationsdeleteMin 和按键搜索的有效数据结构
【发布时间】:2010-11-15 16:46:35
【问题描述】:

我有100组A对象,每组对应一个查询点Qi,1 <= i <= 100

class A {
    int id;
    int distance;
    float x;
    float y;
}

在我的算法的每次迭代中,我选择一个查询点 Qi 并从相应的集合中提取具有最小距离值的对象。然后,我必须在所有 100 个集合中找到这个特定对象,使用它的 id 进行搜索,然后删除所有这些对象。

如果我为每组对象使用一个堆,那么用MIN(distance) 提取对象是很便宜的。但是,我将无法在使用 id 搜索的其他堆中找到相同的对象,因为堆是使用距离值组织的。此外,更新堆的成本很高。

我考虑过的另一个选项是为每个集合使用map<id, (distance, x, y)>。这种按 id 搜索(查找操作)的方式很便宜。但是,提取具有最小值的元素需要线性时间(它必须检查地图中的每个元素)。

是否有任何我可以使用的数据结构对我需要的两种操作都有效?

  • extract_min(距离)
  • 查找(id)

提前致谢!

【问题讨论】:

  • 为你做了一些格式化。请使用编辑框上方的按钮正确格式化您的代码。
  • 不是 C++ 女孩,所以不能真正提供有意义的答案,但有时对于这样的情况,最简单的解决方案是两种数据结构:映射或哈希表按索引查找项目,排序数组/堆/树集找到最小的项目。

标签: c++ data-structures heap stl-algorithm


【解决方案1】:

std::mapboost::multi_index

【讨论】:

  • 谢谢,boost::multi_index 完成了这项工作
【解决方案2】:

你可以使用树状图。

【讨论】:

  • 这真的是评论,而不是问题的答案。请使用“添加评论”为作者留下反馈。
  • @stakx 要求有效的数据结构并用数据结构回答是一个答案。 T
  • 我知道。你的答案没有错;它只是很短。如果它解释了,例如,为什么树形图是合适的,它会提供更多的信息;或者您描述了树状图最重要的属性和操作;或者至少链接到完成所有这些的论文。按照您的回答,您可以将其作为评论发布。
【解决方案3】:

一种简单的方法是为每个数据集设置两个地图。第一个包含按 id 排序的所有数据项。第二个是multimap 并将距离映射到 id,以便您可以轻松找出最低距离对应的 id。这将按距离排序,以使找到最小值便宜(因为它将使用距离作为键)。如果您知道距离始终是唯一的,则可以使用 map 而不是 multimap

【讨论】:

    【解决方案4】:

    除了将地图包括为 上面很多人建议,你 可以替换你的最小堆 具有一个结构 恒定的运行时复杂度 提取分钟。您当前的版本 运行时复杂度为 O(log_2(n)) 提取分钟。
    因为你的距离范围是 小,你可以使用“拨号阵列” 算法。键就像“计数排序”。 因为你可能有不止一件物品 一个数组项,但你不关心 等值物品的顺序,你会使用 一个双向链表作为数组的项 数据类型。 Andrew Goldberg 和 Tarjan 论文 关于更快的 Dijkstra 算法 更详细地讨论这个问题。

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多