我有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搜索(查找操作)很便宜。但是,提取具有最小值的元素需要线性时间(它必须检查地图中的每个元素)。
我可以使用哪种数据结构对我需要的操作都有效吗?
提前致谢!
答案 0 :(得分:0)
您可以使用树形图。
答案 1 :(得分:0)
std::map
或boost::multi_index
答案 2 :(得分:0)
一种简单的方法是为每个数据集提供两个映射。第一个包含按id排序的所有数据项。第二个是multimap
和地图到id的距离,这样您就可以轻松找出最低距离对应的id。这个将按距离排序,以便找到最便宜的(因为它会使用距离作为关键)。如果您知道距离始终是唯一的,则可以使用map
代替multimap
。
答案 3 :(得分:0)
除了将地图包含为 上面有很多人提出,你 可以取代你的最小堆 具有结构的结构 运行时复杂性是不变的 最少提取物。您当前的版本 运行时复杂度为O(log_2(n)) 最少提取物 因为你的距离范围是 小,你可以使用&#34;拨号数组&#34; 算法。键是&#34;计算排序&#34;。 因为你可能有多个项目 一个数组项目,但你不关心 您将使用等价物品的顺序 一个双向链表作为数组的项目 数据类型。 Andrew Goldberg和Tarjan的论文 关于更快的Dijkstra算法 更详细地说明这一点。