zoukankan      html  css  js  c++  java
  • 【算法学习】老算法,新姿势,STL——Heap

    “堆”是一个大家很熟悉的数据结构,它可以在(O(log;n))的时间内维护集合的极值。

    这都是老套路了,具体的内部实现我也就不谈了。

    我一般来说,都是用queue库中的priority_queue,也就是STL的优先队列来实现堆的,然而最近我发现了一个新的STL容器,它相对优先队列有着更小的常数和更方便的操作。

    它就是heap,就是堆。

    关于heap,STL提供了4个函数,它们都定义于algorithm库中。它们分别是:

    建立堆:

    make_heap(_First, _Last, _Cmp)

    在堆中添加元素:

    push_heap(_First, _Last, _Cmp)

    要先添加元素,再调用函数。

    在堆中删除元素:

    pop_heap(_First, _Last, _Cmp)

    要先调用函数,再删除(不删也可以,只要保证不会出现内存泄漏或者其它bug)。

    堆排序:

    sort_heap(_First, _Last, _Cmp)

    排完序,就像普通的sort一样了,变成有序数组了。不再具有堆的性质。

    sort一样,其中_First_Last都是头,尾指针或迭代器(对应vector或queue),而_Cmp表示了元素间的大小关系函数。

    类似sort,堆中的元素是[_First, _Last)的区间,若内存不连续,也至少要是可随机访问的迭代器(如vector)。

    其中_Cmp不是必要的,但是如果有定义_Cmp,一般情况下所有函数都需要加上_Cmp。

    还需注意这些函数维护的均是大根堆(即父亲值比孩子大的堆,也称最大堆)。

  • 相关阅读:
    python 爬取网络小说 清洗 并下载至txt文件
    2020.11.25收获
    2020.11.24收获
    2020.11.23收获
    2020.11.22收获
    2020.11.21收获
    Java学习11.21(使用 Servlet 完成控制)
    Java学习11.20
    Java学习11.19(学习servlet第三天)
    Java学习11.17(人口普查前端页面)
  • 原文地址:https://www.cnblogs.com/PinkRabbit/p/7051057.html
Copyright © 2011-2022 走看看