繁体   English   中英

优先队列的优先级函数在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM