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

按相反顺序创建优先级队列

张成济
2023-03-14

我创建了一个名为Element的新o类对象,它有很多值“degree”

class Element(object):
 def __init__(self, name, i):
  self.name = name
  self.degree = i
  # some other values

 #some other functions

 def __cmp__(self, other):
  return cmp(self.degree, other.degree)

我想创建一个包含以下元素的优先级队列:

que = Queue.PriorityQueue()
que.put(Element('element1', 23))
que.put(Element('element2', 45))
que.put(Element('element3', 11))

while not que.empty():
 next_el = que.get()
 print next_el.name + " " + next_el.degree

程序将打印:

element3 11
element1 23
element2 45

但我想:

element2 45
element1 23
element3 11

所以我想做的是,度值越大的元素优先级越高,被优先考虑。第二个问题是:如果两个元素具有相同的度值,那么它们将按哪个顺序取?

共有2个答案

陈渊
2023-03-14

您可以使用此方法来比较:

def __cmp__(self, other):
    return -cmp(self.degree, other.degree)

这将使element1

钱旻
2023-03-14

您可以修改元素类的比较方法以颠倒顺序:

def __cmp__(self, other):
  return -cmp(self.degree, other.degree)

否定cmp的返回将反转队列,因为\uuuu cmp\uuuu根据比较结果返回正、负或零:

cmp(a, b) <  0: a <  b
cmp(a, b) >  0: a >  b
cmp(a, b) == 0: a == b
 类似资料:
  • 我正在研究一种算法,在该算法中,我希望在从该优先级队列中删除元素时,保持优先级队列中具有相同优先级的元素的FIFO顺序。 虽然,我已经看到了将自动递增的序列号作为辅助键的解决方案,并使用它来打破联系,但我需要类似的链接,但我面临的问题是,我想要比较的元素-TestItemChange(下面示例中的类)没有实现Compariable,我无法(也不想)修改它以使其实现。所以现在,在优先级队列中没有FI

  • 优先级队列未维护排序顺序我是否未正确执行?输出时出现错误的排序顺序? 产出:[1, 5, 8, 19, 9]

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 我写了一个迷宫求解程序,该程序应该支持DFS、BFS、a*、Dijkstra和贪婪算法。无论如何,我选择PriorityQueue作为我的frontier数据结构,因为我认为优先级可以表现为队列、堆栈或优先级队列,这取决于比较器的实现。 这就是我如何实现比较器以将优先级队列转换为队列: /由于优先级队列的“自然排序”在队列的头部具有最小的元素,并且当第一个元素小于第二个元素时,传统比较器返回-1,

  • 问题内容: 我编写了一个迷宫求解程序,该程序应该支持DFS,BFS,A *,Dijkstra和贪婪算法。无论如何,我选择了PriorityQueue作为我的边界数据结构,因为我认为优先级的行为就像队列,堆栈或优先级队列一样,取决于比较器的实现。 这是我实现比较器以将优先级队列转换为队列的方式: / 由于优先级队列的“自然排序”元素最少,并且常规比较器在第一个小于第二个时返回-1,因此被黑的比较器始

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