![](/img/trans.png)
[英]How to change the priority function of Priority Queue in Python?
[英]Priority function for Priority Queue not returning string in Python
我正在尝试使用我的 PQElement 的数组列表来实现优先级队列。 我坚持从优先级队列中取出具有最高优先级的 PQ 元素,以便我可以按优先级递减的顺序将优先级队列的元素打印到一个字符串中。
关于如何解决这个问题的任何想法?
我在顶部添加了我得到的结果,而不是我想要得到的结果
Given result: <__main__.PQueue object at 0x7f9ef651c1c0>
<__main__.PQueue object at 0x7f9ef651c1c0>
(0,10) <__main__.PQueue object at 0x7f9ef651c1c0>
Expected result: [(0,10),(1,9),(2,8),(3,7),(4,6),(5,5),(6,4),(7,3),(8,2),(9,1),(10,0),(11,-1),(12,-2),(13,-3),(14,-4)]
class PQElement:
def __init__(self, v, p):
self.val = v
self.priority = p
def __str__(self):
return "("+str(self.val)+","+str(self.priority)+")"
class PQueue:
def __init__(self):
self.inList = []
def size(self):
return self.inList.length
def enq(self, e): # insert (tail)
self.inList.append(e)
def deq(self): # remove
return self.inList.remove(0)
def ___str__(self,):
return str(self.inList)
ls = PQueue()
print(ls)
for i in range(15):
ls.enq(PQElement(i,10-i))
print(ls)
print(ls.deq(),ls)
下面是一个简单的deq
实现。 这个想法是遍历inList
以找到具有最大优先级的元素,然后弹出它:
class PQElement:
def __init__(self, v, p):
self.val = v
self.priority = p
def __str__(self):
return "("+str(self.val)+","+str(self.priority)+")"
class PQueue:
def __init__(self):
self.inList = []
def __len__(self):
return len(self.inList)
def ___str__(self,):
return str(self.inList)
def enq(self, e): # insert (tail)
self.inList.append(e)
def deq(self): # remove
if len(self)==0:
raise IndexError("deq from empty queue")
max_priority = self.inList[0].priority
max_idx = 0
for idx, elmt in enumerate(self.inList):
if elmt.priority > max_priority:
max_priority = elmt.priority
max_idx = idx
return self.inList.pop(max_idx)
请注意,此实现非常幼稚(它具有O(n)
寻道时间)- 更快的替代方法是使用堆而不是列表来保存PQElement
。
我还用更 pythonic 的__len__
方法替换了你的size
方法,它可以让你使用len(ls)
,并删除了 incalid self.inList.length
调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.