• 5.4 heapq--堆队列算法


    本模块实现了堆队列算法,也叫作优先级队列算法。堆队列是一棵二叉树。而且拥有这样特点,它的父节点的值小于等于不论什么它的子节点的值,假设採用数组array实现,能够把它们的关系表示为:heap[k] <= heap[2*k+1] 和 heap[k] <= heap[2*k+2]。对于全部k值都成立,k值从0開始计算。作为比較,能够觉得不存的元素是无穷大的。堆队列有一个比較重要的特性。它的最小值的元素就是在根:heap[0]

    以下的API与教科书上堆算法有两点区别:(a)使用0開始的索引。

    这样可能会让大家看到节点层次的索引上有点别扭的,但这样更适合python语言处理,由于python是以0为開始计算数组和列表的索引。(b)弹出的方法返回的值是最小值,而不是最大值(在教科书上叫作最小堆,最大堆在教科书更通用地使用来教学。由于它更适合排序算法)。

    基于上面两点能够查看一个堆:heap[0]返回一个最小值的项,heap.sort()对整个堆进行排序。

    创建一个堆队列,能够使用一个列表[],也能够使用heapify(x)函数。

    heapq.heappush(heap, item) 

    把一项值压入堆heap,同一时候维持堆的排序要求。

    样例:

    #python 3.4

    import heapq

    h = []

    heapq.heappush(h, 5)

    heapq.heappush(h, 2)

    heapq.heappush(h, 8)

    heapq.heappush(h, 4)

    print(heapq.heappop(h))

    结果输出例如以下:

    2

    heapq.heappop(heap) 

    弹出并返回堆里最小值的项。调整堆排序。

    假设堆为空,抛出异常IndexError

    样例:

    #python 3.4

    import heapq

    h = []

    heapq.heappush(h, 5)

    heapq.heappush(h, 2)

    heapq.heappush(h, 8)

    heapq.heappush(h, 4)

    print(heapq.heappop(h))

    print(heapq.heappop(h))

    结果输出例如以下:

    2

    4

    heapq.heappushpop(heap, item)

    向堆里插入一项。并返回最小值的项。

    组合了前面两个函数。这样更加有效率。

    样例:

    #python 3.4

    import heapq

    h = []

    heapq.heappush(h, 5)

    heapq.heappush(h, 2)

    heapq.heappush(h, 8)

    print(heapq.heappushpop(h, 4))

    结果输出例如以下:

    2

    heapq.heapify(x) 

    就地转换一个列表为堆排序。时间为线性。

    样例:

    #python 3.4

    import heapq

    h = [9, 8, 7, 6, 2, 4, 5]

    heapq.heapify(h)

    print(h)

    结果输出例如以下:

    [2, 6, 4, 9, 8, 7, 5]

    heapq.heapreplace(heap, item) 

    弹出最小值的项。并返回对应的值,最后把新项压入堆。假设堆为空抛出异常IndexError

    样例:

    #python 3.4

    import heapq

    h = [9, 8, 7, 6, 2, 4, 5]

    heapq.heapify(h)

    print(h)

    print(heapq.heapreplace(h, 1))

    print(h)

    结果输出例如以下:

    [2, 6, 4, 9, 8, 7, 5]

    2

    [1, 6, 4, 9, 8, 7, 5]

    heapq.merge(*iterables)

    合并多个堆排序后的列表,返回一个迭代器訪问全部值。

    样例:

    #python 3.4

    import heapq

    h = [9, 8, 7, 6, 2, 4, 5]

    heapq.heapify(h)

    l = [19, 11, 3, 15, 16]

    heapq.heapify(l)

    for i in heapq.merge(h,l):

        print(i, end = ',')

    结果输出例如以下:

    2,3,6,4,9,8,7,5,11,19,15,16,

    heapq.nlargest(n, iterable, key=None) 

    从数据集iterable里获取n项最大值,以列表方式返回。假设參数 key提供,key是一个比較函数。用来比較元素之间的值。

    样例:

    #python 3.4

    import heapq

    h = [9, 1, 7, 6, 2, 4, 5]

    l = heapq.nlargest(3, h)

    print(l)

    结果输出例如以下:

    [9, 7, 6]

    heapq.nsmallest(n, iterable, key=None) 

    从数据集iterable里获取n项最小值,以列表方式返回。假设參数 key提供,key是一个比較函数,用来比較元素之间的值。相当于:sorted(iterable, key=key)[:n]

    样例:

    #python 3.4

    import heapq

    h = [9, 1, 7, 6, 2, 4, 5]

    l = heapq.nsmallest(3, h)

    print(l)

    结果输出例如以下:

    [1, 2, 4]

    在最后这两个函数中,假设数量比較少时使用起来比較高效,假设数据量比較大,要使用sorted()函数。假设n=1最好使用内置函数min()max()

    採用堆算法来实现排序:

    样例:

    #python 3.4

    import heapq

    def heapsort(iterable):

        '实现与sorted(iterable)同样的功能'

        h = []

        for value in iterable:

            heapq.heappush(h, value)

        return [heapq.heappop(h) for i in range(len(h))]

    print(heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0]))

    结果输出例如以下:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]



    蔡军生  QQ:9073204  深圳

  • 相关阅读:
    226_翻转二叉树
    199_二叉树的右视图
    145_二叉树的后序遍历
    做IT,网络/系统/数据库/软件开发都得懂
    [恢]hdu 1200
    [恢]hdu 2080
    [恢]hdu 1222
    [恢]hdu 1128
    [恢]hdu 2153
    [恢]hdu 2132
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7217950.html
Copyright © 2020-2023  润新知