deleteMin和按键操作搜索的有效数据结构

时间:2010-11-15 16:46:36

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

我有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)

提前致谢!

4 个答案:

答案 0 :(得分:0)

您可以使用树形图。

答案 1 :(得分:0)

std::mapboost::multi_index

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除了将地图包含为 上面有很多人提出,你 可以取代你的最小堆 具有结构的结构 运行时复杂性是不变的 最少提取物。您当前的版本 运行时复杂度为O(log_2(n)) 最少提取物 因为你的距离范围是 小,你可以使用&#34;拨号数组&#34; 算法。键是&#34;计算排序&#34;。 因为你可能有多个项目 一个数组项目,但你不关心 您将使用等价物品的顺序 一个双向链表作为数组的项目 数据类型。 Andrew Goldberg和Tarjan的论文 关于更快的Dijkstra算法 更详细地说明这一点。