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

当一个对象被取出以更新其优先级时,如何保持该对象在优先级队列中的优先级?

董品
2023-03-14

我想知道,一旦对象被删除并重新插入队列以更新其优先级,是否无论如何都要保持优先级队列中对象的优先级?

我这样做的方法是从优先级队列中删除对象,并将更新后的对象再次放入队列中。然而,这将破坏我使用<code>比较器实现的自然排序

<代码>比较器 :

class PriorityValueComparator implements Comparator<Human>{
    public int compare(Human x, Human y){
        return y._priority - x._priority;
    }
}

例如

按以下顺序插入:约翰、亚历克斯、科比、简

优先级队列的形式如下:[Jane,100],[Kerby,59],[Alex,33],[John,13]

将John更新为100

[约翰,100](因为约翰入在简之前), [简, 100], [克比, 59], [亚历克斯, 33]

更新:或者,在人类类中,可以添加静态属性time。在人类的构造函数中,

public Human() {
    //add in whatever you want here
    time++; //This will ensure that every elements will have their own unique order number
}

共有1个答案

章昆琦
2023-03-14

优先级队列实现允许在具有相同优先级的元素之间任意选择。如果您想强制执行特定的顺序,那么您需要更改比较器。假设您维护一个字段_insertion_time,以便前面插入的人类具有较小的非负值,那么您可以将比较器重写为

class PriorityValueComparator implements Comparator<Human>{
    public int compare(Human x, Human y){
        if (y._priority != x._priority) return y._priority - x._priority;
        else return y._insertion_time - x._insertion_time;
    }
}
 类似资料:
  • 我所拥有的是一个类,它创建了一个具有优先级、到达时间和完成时间的对象。我还有许多优先级队列可以将它们放入其中。当我开始时,我将它们放入到达队列中,对它们进行排序,然后查看哪个第一个进入,并将其放入队列中。但是,当我尝试向到达队列添加第二个队列时,它会失败并抛出一个异常。我首先要做的是将所有进程添加到到达队列中,然后对它们进行排序,这样到达时间最短的进程将是到达队列中第一个进入队列的进程。谢谢你帮忙

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我正在使用std::priority\u队列和std::vector中的一些自定义对象。现在假设在调用top()函数时,有具有相同优先级的对象,我会按从最旧到最新的顺序获取它们。那么我的问题是,有没有可能改变这种行为,以便top()在优先级相同的情况下返回最近的对象?

  • 在我的python应用程序中,我使用芹菜作为任务生产者和消费者,使用RabbitMQ作为代理。现在,我正在实施优先级排序。起初,它看起来根本不起作用,因为根据文档,我刚刚在队列中添加了参数。我更深入地研究了一下,发现了另一种优先级——消费者优先级和任务优先级。所以,现在,看起来有三种不同的优先顺序,我完全困惑了。你能给我解释一下区别吗? 队列最大优先级:即https://www.rabbitmq.

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。