class Node:
def __init__(self, value, lv):
super(Node, self).__init__()
self.lv = lv
self.value = value
class MinPreQueue:
def __init__(self):
super(MinPreQueue, self).__init__()
self.item = [Node(None, None)]
self._N = 0
def put(self, node):
self.item.append(node)
self._N += 1
self._swim(self._N)
def _compare(self, i, j):
return self.item[i].lv > self.item[j].lv
def _exch(self, i, j):
self.item[i], self.item[j] = self.item[j], self.item[i]
def _swim(self, n):
if n > 1 and self._compare(temp := int(n/2), n):
self._exch(n, temp)
else:
return
self._swim(temp)
def get(self):
if self._N == 0:
return Node(None, None)
temp = self.item[1]
self._exch(n := 1, self._N)
self.item.pop()
self._N -= 1
self._sink(2 * n, 1)
return temp
def _sink(self, n, temp):
if n > self._N:
return
if n+1 > self._N:
if self._compare(temp, n):
self._exch(temp, n)
return
if self._compare(n, n+1):
self._exch(temp, temp := n+1)
else:
self._exch(temp, temp := n)
self._sink(2*n, temp)
if __name__ == '__main__':
pq = MinPreQueue()
pq.put(Node(3, lv=2))
pq.put(Node(2, lv=4))
pq.put(Node(2, lv=5))
pq.put(Node(2, lv=6))
pq.put(Node(2, lv=7))
pq.put(Node(2, lv=9))
print([i.lv for i in pq.item[1:]])
print(pq.get().lv)
print([(i.lv, i.value) for i in pq.item[1:]])
print(pq.get().lv)
print(pq.get().lv)
print([(i.lv, i.value) for i in pq.item[1:]])
print(pq.get().lv)
print([(i.lv, i.value) for i in pq.item[1:]])
print(pq.get().lv)
print([(i.lv, i.value) for i in pq.item[1:]])
print(pq.get().lv)
print(pq.get().lv)
python实现最小优先队列
最新推荐文章于 2023-02-01 14:02:30 发布