当前位置: 首页 > 知识库问答 >
问题:

更新元素更改时的优先级队列顺序

符俊材
2023-03-14

我在这个问题上发现了一些类似的问题,但我想再问一遍,以便得到一个更明确的答案。我正在编写一个图匹配算法,其中图上的每个节点分配给一个优先级集,取决于其邻居的匹配。细节其实并不重要,但我使用了std::priority_queue以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。

我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有任何其他数据结构(例如max heap)可以用于此目的?请注意,将新元素推入队列对我来说不是一个有效的解决方案。下面是我正在使用的代码片段(matchFace()function updates the element priorities):

while (priorityQueue.size() != 0) {

    // Take the face at the top of the queue and check if it is already matched
    FaceData* currentFace = priorityQueue.top();

    // Pop the face at the top in any case
    priorityQueue.pop();

    // If the face is not already matched, try to find a matching
    if (!currentFace->matched) {

        // Try to match the face with one of its neighbors, add it to the unmatched faces list if it fails
        int neighborId = matchFace(currentFace);
        if (neighborId == -1) {
            unmatchedFaces.push_back(currentFace);
        } else {
            matchingMap[currentFace->id] = neighborId;
        }
    }
}

共有1个答案

袁晋鹏
2023-03-14

利用我收到的关于这个问题的评论,我决定自己来回答这个问题。我发现有三种可能的方法可以克服这个问题:

  • 实现您自己的可更新优先级队列或使用外部库。Boost可能有一些额外的数据结构用于此目的。我还在这里找到了一个可更新的优先级队列源代码。
  • 使用向量存储值,并在每次收到更新时使用算法库中提供的std::make_heap函数。这是最简单的方法,但工作速度很慢。
  • 删除并重新插入元素。如果这不是一种有效的方法,请使用映射来存储元素ID,而不是删除元素,而是在映射上标记元素,以便在多次遇到它们时可以忽略它们。另一种策略是通过添加标志来更改项,并通过打开标志来标记元素。
 类似资料:
  • 问题内容: 我正在尝试使用来使用排序对象。 这很容易实现,但是对象类变量(比较器用来计算优先级)在初始插入后可能会更改。大多数人提出了一种简单的解决方案,即删除对象,更新值并再次将其重新插入,因为这是优先级队列的比较器投入使用的时候。 除了围绕PriorityQueue创建包装器类之外,还有其他更好的方法吗? 问题答案: 你必须删除并重新插入,因为队列的工作原理是在插入新元素时将它们放置在适当的位

  • 我有一个priority_queue,我想修改它的一些内容(优先级值),那么这个队列会被使用吗? 这取决于它是使用Push/Pop(更有可能,因为你只需要“插入”,而不是整个使用),还是访问top或Pop。 我很想更改队列中的一些元素。大概是这样的:

  • 我正在寻找一种通过优先级和先到先服务(FCFS)调度线程的方法,如果两个线程具有相同的优先级。我在考虑使用一堆队列或类似的东西。问题是,即使我实现了自己的优先级队列,更改优先级的能力也会破坏插入到该队列的顺序。

  • 我试图理解为什么我的A*搜索的实现似乎工作良好,尽管我似乎是在优先级队列后面更新键。 在表示映射的类中,我有以下数据结构来保存映射中的所有节点(例如从文件加载)。 为了实现*搜索,我的MapNode类包含“从开始到开始的距离”和“从目标到启发式距离”属性。在搜索开始之前,我将映射中每个节点的距离初始化为无穷大。这一切都很好。 稍后,作为*实现的一部分,当我在node对象中重新计算和更新距离时,我将

  • 我正在尝试在滑动窗口中打印最大值。将窗口大小的元素,这里k=3放入优先级队列(Maxheap),然后查看值。”heap.Init(

  • 问题内容: 默认情况下,优先级队列的元素如何按照自然顺序排序,因为它没有实现可比的接口。 从文档中可以看出,元素是根据自然顺序进行排序的,但是我找不到任何关于equals方法或可比性的东西。它在内部如何发生? 所有实现的接口:可序列化,可迭代,集合,队列。 如果它实现可比性,那么为什么不在上一行说 例: 第三条打印语句也将打印[1、3、2、4],而不是打印[1、2、3、4]。为什么?应该自然排序吧