Python:在优先级队列实现中使用我的堆
Python: Using my heap in a priority queue implementation
我在使用要在我的优先级队列 class 中使用的定制堆 class 函数时遇到了真正的麻烦。我无法确定堆 class 中的哪些函数可用于我的 PriorityQueue 的 "enqueue"、"dequeue"、"front" 和 "size" 函数。我知道 "enqueue" 我需要使用我的插入功能,但我不知道如何去做,因为我有优先权。有人可以帮我解决我需要做的事情才能使我的 PriorityQueue class 使用堆 class 中的函数才能正常工作吗?我已经坚持了一段时间,我一直在寻找答案,包括使用内置的 python 函数,例如队列和 heapq。
class 堆(对象):
def __init__(self, items=None):
'''Post: A heap is created with specified items.'''
self.heap = [None]
if items is None:
self.heap_size = 0
else:
self.heap += items
self.heap_size = len(items)
self._build_heap()
def size(self):
'''Post: Returns the number of items in the heap.'''
return self.heap_size
def _heapify(self, position):
'''Pre: Items from 0 to position - 1 satisfy the Heap property.
Post: Heap Property is satisfied for the entire heap.'''
item = self.heap[position]
while position * 2 <= self.heap_size:
child = position * 2
# If the right child, determine the maximum of two children.
if (child != self.heap_size and self.heap[child+1] > self.heap[child]):
child += 1
if self.heap[child] > item:
self.heap[position] = self.heap[child]
position = child
else:
break
self.heap[position] = item
def delete_max(self):
'''Pre: Heap property is satisfied
Post: Maximum element in heap is removed and returned. '''
if self.heap_size > 0:
max_item = self.heap[1]
self.heap[1] = self.heap[self.heap_size]
self.heap_size -= 1
self.heap.pop()
if self.heap_size > 0:
self._heapify(1)
return max_item
def insert(self, item):
'''Pre: Heap Property is Satisfied.
Post: Item is inserted in proper location in heap.'''
self.heap_size += 1
# extend the length of the list.
self.heap.append(None)
position = self.heap_size
parent = position // 2
while parent > 0 and self.heap[parent] < item:
# Move the item down.
self.heap[position] = self.heap[parent]
position = parent
parent = position // 2
# Puts the new item in the correct spot.
self.heap[position] = item
def _build_heap(self):
''' Pre: Self.heap has values in 1 to self.heap_size
Post: Heap property is satisfied for entire heap. '''
# 1 through self.heap_size.
for i in range(self.heap_size // 2, 0, -1): # Stops at 1.
self._heapify(i)
def heapsort(self):
'''Pre: Heap Property is satisfied.
Post: Items are sorted in self.heap[1:self.sorted_size].'''
sorted_size = self.heap_size
for i in range(0, sorted_size -1):
# Since delete_max calls pop to remove an item, we need to append a dummy value to avoid an illegal index.
self.heap.append(None)
item = self.delete_max()
self.heap[sorted_size - i] = item
所以这是可行的,但正如我之前所说,我在如何从中创建优先级队列时遇到了问题?我知道要求密码是错误的,但我很绝望有人能帮我吗?我对我希望我的优先代码做什么有基本的了解..
#PriorityQueue.py
from MyHeap import Heap
class PriorityQueue(object):
def __init__(self):
self.heap = None
def enqueue(self, item, priority):
'''Post: Item is inserted with specified priority in the PQ.'''
self.heap.insert((priority, item))
def first(self):
'''Post: Returns but does not remove the highest priority item from the PQ.'''
return self.heap[0]
def dequeue(self):
'''Post: Removes and returns the highest priority item from the PQ.'''
if self.heap is None:
raise ValueError("This queue is empty.")
self.heap.delete_max()
def size(self):
'''Post: Returns the number of items in the PQ.'''
return self.size
这是我目前得到的,但我不知道它是否完全正确。谁能帮帮我?
我将代码编辑为最新版本。
由于这大概是作业,所以我能做的就是给出提示,通常作为评论更容易完成。由于这是一系列相当详尽的提示,因此我将它们总结为此处的答案。
在大多数情况下,您 PriorityQueue
class 中的方法将映射到您已经在堆中实现的方法 class:
PriorityQueue.enqueue()
很容易映射到 Heap.insert()
PriorityQueue.first()
没有对应的堆方法,但还是可以一行实现。您只需要 return 最大值,它始终位于堆中的特定位置。
PriorityQueue.dequeue()
稍微复杂一点。它需要先保存top item的值,这样它可以在调用heap.delete_max()
之后return它
- 堆 class 已经有一个
size()
方法,PriorityQueue.size()
可以调用它,而不是在 PriorityQueue
class 中维护一个单独的大小变量.
此外,您需要一个 init 函数,这应该创建一个新的 Heap 对象,该对象将由 class 维护。
为了创建一个迭代器,您需要创建一个新的 class。它需要维护一个整数变量(我们称它为 self.index
),指示它在队列中的当前位置。您还需要一种方法来增加 self.index
和 returns 先前索引位置的值。应该差不多了。
我在使用要在我的优先级队列 class 中使用的定制堆 class 函数时遇到了真正的麻烦。我无法确定堆 class 中的哪些函数可用于我的 PriorityQueue 的 "enqueue"、"dequeue"、"front" 和 "size" 函数。我知道 "enqueue" 我需要使用我的插入功能,但我不知道如何去做,因为我有优先权。有人可以帮我解决我需要做的事情才能使我的 PriorityQueue class 使用堆 class 中的函数才能正常工作吗?我已经坚持了一段时间,我一直在寻找答案,包括使用内置的 python 函数,例如队列和 heapq。
class 堆(对象):
def __init__(self, items=None):
'''Post: A heap is created with specified items.'''
self.heap = [None]
if items is None:
self.heap_size = 0
else:
self.heap += items
self.heap_size = len(items)
self._build_heap()
def size(self):
'''Post: Returns the number of items in the heap.'''
return self.heap_size
def _heapify(self, position):
'''Pre: Items from 0 to position - 1 satisfy the Heap property.
Post: Heap Property is satisfied for the entire heap.'''
item = self.heap[position]
while position * 2 <= self.heap_size:
child = position * 2
# If the right child, determine the maximum of two children.
if (child != self.heap_size and self.heap[child+1] > self.heap[child]):
child += 1
if self.heap[child] > item:
self.heap[position] = self.heap[child]
position = child
else:
break
self.heap[position] = item
def delete_max(self):
'''Pre: Heap property is satisfied
Post: Maximum element in heap is removed and returned. '''
if self.heap_size > 0:
max_item = self.heap[1]
self.heap[1] = self.heap[self.heap_size]
self.heap_size -= 1
self.heap.pop()
if self.heap_size > 0:
self._heapify(1)
return max_item
def insert(self, item):
'''Pre: Heap Property is Satisfied.
Post: Item is inserted in proper location in heap.'''
self.heap_size += 1
# extend the length of the list.
self.heap.append(None)
position = self.heap_size
parent = position // 2
while parent > 0 and self.heap[parent] < item:
# Move the item down.
self.heap[position] = self.heap[parent]
position = parent
parent = position // 2
# Puts the new item in the correct spot.
self.heap[position] = item
def _build_heap(self):
''' Pre: Self.heap has values in 1 to self.heap_size
Post: Heap property is satisfied for entire heap. '''
# 1 through self.heap_size.
for i in range(self.heap_size // 2, 0, -1): # Stops at 1.
self._heapify(i)
def heapsort(self):
'''Pre: Heap Property is satisfied.
Post: Items are sorted in self.heap[1:self.sorted_size].'''
sorted_size = self.heap_size
for i in range(0, sorted_size -1):
# Since delete_max calls pop to remove an item, we need to append a dummy value to avoid an illegal index.
self.heap.append(None)
item = self.delete_max()
self.heap[sorted_size - i] = item
所以这是可行的,但正如我之前所说,我在如何从中创建优先级队列时遇到了问题?我知道要求密码是错误的,但我很绝望有人能帮我吗?我对我希望我的优先代码做什么有基本的了解..
#PriorityQueue.py
from MyHeap import Heap
class PriorityQueue(object):
def __init__(self):
self.heap = None
def enqueue(self, item, priority):
'''Post: Item is inserted with specified priority in the PQ.'''
self.heap.insert((priority, item))
def first(self):
'''Post: Returns but does not remove the highest priority item from the PQ.'''
return self.heap[0]
def dequeue(self):
'''Post: Removes and returns the highest priority item from the PQ.'''
if self.heap is None:
raise ValueError("This queue is empty.")
self.heap.delete_max()
def size(self):
'''Post: Returns the number of items in the PQ.'''
return self.size
这是我目前得到的,但我不知道它是否完全正确。谁能帮帮我?
我将代码编辑为最新版本。
由于这大概是作业,所以我能做的就是给出提示,通常作为评论更容易完成。由于这是一系列相当详尽的提示,因此我将它们总结为此处的答案。
在大多数情况下,您 PriorityQueue
class 中的方法将映射到您已经在堆中实现的方法 class:
PriorityQueue.enqueue()
很容易映射到 Heap.insert()PriorityQueue.first()
没有对应的堆方法,但还是可以一行实现。您只需要 return 最大值,它始终位于堆中的特定位置。PriorityQueue.dequeue()
稍微复杂一点。它需要先保存top item的值,这样它可以在调用heap.delete_max()
之后return它
- 堆 class 已经有一个
size()
方法,PriorityQueue.size()
可以调用它,而不是在PriorityQueue
class 中维护一个单独的大小变量.
此外,您需要一个 init 函数,这应该创建一个新的 Heap 对象,该对象将由 class 维护。
为了创建一个迭代器,您需要创建一个新的 class。它需要维护一个整数变量(我们称它为 self.index
),指示它在队列中的当前位置。您还需要一种方法来增加 self.index
和 returns 先前索引位置的值。应该差不多了。