用Python实现数据结构之优先级队列(2)

def parent(self, j):
        """
        返回父节点的索引
        """
        return (j - 1) // 2

def left(self, j):
        """返回左孩子索引"""
        return 2 * j + 1

def right(self, j):
        """返回右孩子索引"""
        return 2 * j + 2

def has_left(self, j):
        """通过判断索引是否出了列表来判断是否存在"""
        return self.left(j) < len(self.data)

def has_right(self, j):
        return self.right(j) < len(self.data)

def swap(self, i, j):
        self.data[i], self.data[j] = self.data[j], self.data[i]

def upheap(self, j):
        """向上堆排序"""
        parent = self.parent(j)
        if j > 0 and self.data[j] < self.data[parent]:
            self.swap(j, parent)
            self.upheap(parent)

def downheap(self, j):
        """向下堆排序"""
        if self.has_left(j):
            left = self.left(j)
            small = left
            if self.has_right(j):
                right = self.right(j)
                if self.data[right] < self.data[left]:
                    small = right
            if self.data[small] < self.data[j]:
                self.swap(small, j)
                self.downheap(small)

def __init__(self):
        self.data = []

def __len__(self):
        return len(self.data)

def add(self, key, value):
        """添加一个元素,并进行向上堆排序"""
        self.data.append(self.Item(key, value))
        self.upheap(len(self.data) - 1)

def min(self):
        if self.is_empty():
            raise Empty('Priority queue is empty')
        item = self.data[0]
        return (item.key, item.value)

def remove_min(self):
        if self.is_empty():
            raise Empty('Priority queue is empty')
        self.swap(0, len(self.data) - 1)
        item = self.data.pop()
        self.downheap(0)
        return (item.key, item.value)

python的heapq模块

Python标准包含了heapq模块,但他并不是一个独立的数据结构,而是提供了一些函数,这些函数吧列表当做堆进行管理,而且元素的优先级就是列表中的元素本身,除此之外它的模型与实现方式与刚才我们自己定义的基本相同

有以下函数:

heappush(L,e): 将元素e存入列表L中并进行堆排序

heappop(L): 取出并返回优先级最小的元素,并重新堆排序

heappushpop(L,e): 将e放入列表中,同时返回最小元素,相当于先执行push,再pop

heap replace(L,e): 与heappushpop类似,是先执行pop,再执行push

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7e8a2e159eb78f990bc11a70a5a43b4b.html