实际上我的排序算法有效,但是有一个问题。 我有一个名为SortedItem的类,其中包括
def __init__(self, point, cost):
self.coordinate = point
self.cost = cost
还有一个优先级队列,该队列按其费用对SortedItem进行排序:
class PriorityQueue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def sortComparatorByCost(self, item):
return item.cost
def enqueue(self, item):
self.items.append(item)
self.items.sort(key=self.sortComparatorByCost, reverse=True)
def dequeue(self):
return self.items.pop()
def returnQueueAsString(self):
queue_str = ""
for eachItem in self.items:
queue_str += str(eachItem) + " "
return queue_str
def isQueueContainsElement(self, element):
for eachElement in self.items:
if eachElement[0] == element:
return True
return False
此问题发生在这里: -我定义了一些添加队列的命令。假设我要将这个对象添加到队列中:
obj1 = SortedItem((1,0), 10))
queue.enqueue(obj1)
obj2 = SortedItem((2,0), 15))
queue.enqueue(obj2)
obj3 = SortedItem((2,1), 15))
queue.enqueue(obj3)
请注意:我刚刚创建了一个简单的问题示例。如果您尝试使用此代码,则可以按以下顺序获取对象:obj1,obj2,obj3
答案 0 :(得分:2)
与其以相反的顺序对项目进行排序并将其从右侧删除,
def enqueue(self, item): self.items.append(item) self.items.sort(key=self.sortComparatorByCost, reverse=True) def dequeue(self): return self.items.pop()
您可以从左侧将其删除。这样可以避免以相同的成本颠倒物品的插入顺序。
def enqueue(self, item):
self.items.append(item)
self.items.sort(key=self.sortComparatorByCost)
def dequeue(self):
return self.items.pop(0)
但是,从列表is not efficient的开头删除项目,因此最好使用deque
(用pop(0)
替换popleft()
)来解决。另一方面,deque
没有就地sort()
方法,因此也需要用self.items.sort()
替换self.items = deque(sorted(self.items))
。