zoukankan      html  css  js  c++  java
  • 当堆遇到STL 代码焕发光芒

    来自度娘的释义,堆的含义大概是这样的:

    感性理解:

    堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
    • 堆中某个节点的值总是不大于或不小于其父节点的值;
    • 堆总是一棵完全二叉树。
    将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

    理性理解:

    堆的定义如下:
      n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
      (ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)

    然而手写堆实在太困难有点长了,在NOIp&&NOI赛场上时间有限,所以一个模板的重要性不言而喻;(比如我排序向来都是sort

    会手写堆的都是神犇!

    真的!

    反正我写不了2333

    所以上帝为可爱的c++党准备了贴身的STL模板-->heap;

    1.make_heap 构建堆

      默认用法 (但这样生成的是大根堆;如果需要构建小根堆,需要进行修改。

        Eg:

    1 vector<int> v{6, 1, 2, 5, 3, 4};
    2 make_heap(v.begin(), v.end());

      

      自建小根堆  

        Eg:自定义比较函数:(似乎是这样我并不太懂

    1 vector<int> v{6, 1, 2, 5, 3, 4};
    2 make_heap(v.begin(), v.end(), greater<int>());

        这里使用了greater<int>()来代替默认的less<int>()来创建int类型的heap。

        可以按层次遍历的顺序把这个heap画出来,可以看到它跟默认情况刚好相反,会是一个小顶堆。

    2. push_heap 把指定区间的最后一个元素插入到堆中

     1 v.push_back(200);

    2 push_heap(v.begin(), v.end());  

     注意:需要满足的是此时的v必须满足是一个在区间(v.begin(), v.end())内满足堆的性质;不能直接比较23333

    所以我一直觉得即使手写堆也可以使用模板

    毕竟我不会写

    这样就比较简单。

    3. pop_heap 把指定区间的最后一个元素插入到堆中

    比如这样:

    1 pop_heap(v.begin(), v.end());

    2 auto largest = v.back();

    3 psln(largest);

    4 v.pop_back();  

    依旧需要满足v是一个堆;

    而且他会将除最大值以外的节点重排;而v.back( )便将其找到了;

    所以删除它只需要令v.back()=0就行了。

    海星

    3. pop_heap 把指定区间的最后一个元素插入到堆中

    sort_heap(v.begin(), v.end());
    printContainer(v, "after sort_heap: ");
    

     堆排序;

    没了

    c++11里面的玄学东西高考完再说

    现在不敢用

    毕竟我是一个联赛选手

    引用资料:

    • 【C++ STL应用与实现】72: 标准库里的堆--如何使用标准库的heap算法 https://blog.csdn.net/elloop/article/details/53402209

    • 百度百科 堆  https://baike.baidu.com/item/%E5%A0%86/20606834?fr=aladdin
  • 相关阅读:
    hibernate框架学习之增删改查helloworld
    hibernate学习笔记第七天:二级缓存和session管理
    hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存
    hibernate框架学习第五天:数据查询、投影等
    hibernate框架学习第四天:关联关系、外键、级联等
    hibernate框架学习第三天:对象状态、一级缓存、快照等
    词链—动态规划
    智力大冲浪-贪心
    高精度开方数
    高精度最小公倍数
  • 原文地址:https://www.cnblogs.com/luv-letters/p/9525520.html
Copyright © 2011-2022 走看看