视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python计算最大优先级队列实例
2020-11-27 14:38:47 责编:小采
文档


代码如下:


# -*- coding: utf-8 -*-

class Heap(object):

@classmethod
def parent(cls, i):
"""父结点下标"""
return int((i - 1) >> 1);

@classmethod
def left(cls, i):
"""左儿子下标"""
return (i << 1) + 1;

@classmethod
def right(cls, i):
"""右儿子下标"""
return (i << 1) + 2;

class MaxPriorityQueue(list, Heap):

@classmethod
def max_heapify(cls, A, i, heap_size):
"""最大堆化A[i]为根的子树"""
l, r = cls.left(i), cls.right(i)
if l < heap_size and A[l] > A[i]:
largest = l
else:
largest = i
if r < heap_size and A[r] > A[largest]:
largest = r
if largest != i:
A[i], A[largest] = A[largest], A[i]
cls.max_heapify(A, largest, heap_size)

def maximum(self):
"""返回最大元素,伪码如下:
HEAP-MAXIMUM(S)
1 return A[1]

T(n) = O(1)
"""
return self[0]

def extract_max(self):
"""去除并返回最大元素,伪码如下:
HEAP-EXTRACT-MAX(A)
1 if heap-size[A] < 1
2 then error "heap underflow"
3 max ← A[1]
4 A[1] ← A[heap-size[A]] // 尾元素放到第一位
5 heap-size[A] ← heap-size[A] - 1 // 减小heap-size[A]
6 MAX-HEAPIFY(A, 1) // 保持最大堆性质
7 return max

T(n) = θ(lgn)
"""
heap_size = len(self)
assert heap_size > 0, "heap underflow"
val = self[0]
tail = heap_size - 1
self[0] = self[tail]
self.max_heapify(self, 0, tail)
self.pop(tail)
return val

def increase_key(self, i, key):
"""将i处的值增加到key,伪码如下:
HEAP-INCREASE-KEY(A, i, key)
1 if key < A[i]
2 the error "new key is smaller than current key"
3 A[i] ← key
4 while i > 1 and A[PARENT(i)] < A[i] // 不是根结点且父结点更小时
5 do exchange A[i] ↔ A[PARENT(i)] // 交换两元素
6 i ← PARENT(i) // 指向父结点位置

T(n) = θ(lgn)
"""
val = self[i]
assert key >= val, "new key is smaller than current key"
self[i] = key
parent = self.parent
while i > 0 and self[parent(i)] < self[i]:
self[i], self[parent(i)] = self[parent(i)], self[i]
i = parent(i)

def insert(self, key):
"""将key插入A,伪码如下:
MAX-HEAP-INSERT(A, key)
1 heap-size[A] ← heap-size[A] + 1 // 对元素个数增加
2 A[heap-size[A]] ← -∞ // 初始新增加元素为-∞
3 HEAP-INCREASE-KEY(A, heap-size[A], key) // 将新增元素增加到key

T(n) = θ(lgn)
"""
self.append(float('-inf'))
self.increase_key(len(self) - 1, key)

if __name__ == '__main__':
import random

keys = range(10)
random.shuffle(keys)
print(keys)

queue = MaxPriorityQueue() # 插入方式建最大堆
for i in keys:
queue.insert(i)
print(queue)

print('*' * 30)

for i in range(len(keys)):
val = i % 3
if val == 0:
val = queue.extract_max() # 去除并返回最大元素
elif val == 1:
val = queue.maximum() # 返回最大元素
else:
val = queue[1] + 10
queue.increase_key(1, val) # queue[1]增加10
print(queue, val)

print([queue.extract_max() for i in range(len(queue))])

下载本文
显示全文
专题