算法与数据结构——大顶堆 and 小顶堆
创始人
2024-12-16 13:06:05
0

0.定义

大顶堆:树中所有根节点必须大于等于其左儿子和右儿子,因此根节点是最大值。
小顶堆:树中所有根节点必须大于等于其左儿子和右儿子,因此根节点是最小值。

1.自己实现大顶堆和小顶堆

#pragma once  #include  #include  #include  using namespace std;   // 小顶堆 template  struct myGreater {     bool operator()(const T &left, const T &right) { return left > right; } };  // 大顶堆 template  struct myLess {     bool operator()(const T &left, const T &right) { return left < right; } };  template > class myHeap { public:     myHeap() {}      myHeap(vector vec)     {         _array.reserve(vec.size());         _array.assign(vec.begin(), vec.end());          // 建堆         for (int i = _array.size() / 2 - 1; i >= 0; i--)             AjustDown(i);     }      bool empty() const { return _array.empty(); }      size_t size() const { return _array.size(); }      T &top()     {         assert(!_array.empty());         return _array[0];     }      void push(T elem)     {         _array.push_back(elem);         AjustUp(_array.size() - 1);     }      void pop()     {         assert(!_array.empty());         swap(_array[0], _array[_array.size() - 1]);         _array.pop_back();         AjustDown(0);     }  private:     void AjustDown(int parent)     {         int child = parent * 2 + 1; // left child idx         while (child < _array.size())         {             if (child + 1 < _array.size() && cmp(_array[child], _array[child + 1]))                 ++child;              if (cmp(_array[parent], _array[child]))             {                 swap(_array[parent], _array[child]);                 parent = child;                 child = 2 * parent + 1;             }             else                 break;         }     }      void AjustUp(int child)     {         int parent = (child - 1) / 2;         while (parent >= 0)         {             if (cmp(_array[parent], _array[child]))             {                 swap(_array[parent], _array[child]);                 child = parent;                 parent = (child - 1) / 2;             }             else                 break;         }     }      vector _array;     Compare cmp; };  template  using maxHeap = myHeap>;  template  using minHeap = myHeap>;   int main() {     vector a = {11, 10, 13, 12, 16, 18, 15, 17, 14, 19};     myHeap hp1(a);      cout << hp1.top() << endl;     hp1.push(90);     hp1.push(900);     cout << hp1.top() << endl;     hp1.pop();     hp1.pop();     hp1.pop();     hp1.pop();     hp1.pop();     hp1.pop();     hp1.pop();      // system("pause");     return 0; }  

比较重要的是:

  1. 仿函数的写法:大顶堆是leftright,命名为Greater。
  2. 堆调整是cmp(_array[parent], _array[child])或者cmp(_array[left_child], _array[right_child]),这个顺序是和第一步仿函数的写法对应。这个过程详细描述如下:(以Less为例),Less是left 第一步,进行左孩子取值 < 右孩子取值比较,如果为真,使用右孩子与父节点比较,否则使用做孩子与父节点比较(见 AjustDown 函数体内 while 循环后第一个 if 语句);
    第二步,在父节点取值 < 孩子节点取值时,交换父和子,于是取值较大的孩子节点成为根节点(也就是说这个堆是大顶堆)。

2.STL优先队列

给自己打个广告:找工作准备刷题day1 栈与队列

优先队列练手:Leetcode347.前K个高频元素

自己写完以后更好地理解 为什么 小顶堆 的仿函数 是 >

相关内容

热门资讯

终于发现!微信牛牛房卡链接在哪... 微信游戏中心:牛牛房卡,添加微信【66336574】,进入游戏中心或相关小程序,搜索“微信牛牛房卡”...
一分钟介绍使用,微信链接斗牛房... 超稳大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来...
终于发现!微信链接炸金花房卡怎... 微信游戏中心:炸金花房卡,添加微信【71319951】,进入游戏中心或相关小程序,搜索“微信炸金花房...
全网内容,炸金花房卡链接在哪弄... 皇豪互众是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来...
科技实测!牛牛房卡出售昆仑大厅... 科技实测!牛牛房卡出售昆仑大厅/房卡客服昆仑大厅是一款非常受欢迎的游戏,咨询房/卡添加微信:8835...
重大通报,金花房卡官网玄武大厅... 玄武大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
终于发现!拼三张的房卡找谁买,... 微信游戏中心:拼三张房卡,添加微信【56001354】,进入游戏中心或相关小程序,搜索“微信拼三张房...
头条推荐!牛牛充值房卡新详心/... 头条推荐!牛牛充值房卡新详心/飞鹰大厅/房卡哪家便宜Sa9Ix苹果iPhone 17手机即将进入量产...
一分钟科普,微信炸金花模式创建... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房...
正版授权!牛牛房卡游戏平台加盟... 今 日消息,凤凰大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
终于发现!微信玩链接炸金花房卡... 微信游戏中心:炸金花房卡,添加微信【66336574】,进入游戏中心或相关小程序,搜索“微信炸金花房...
一分钟了解!牛牛房卡制作链接鸿... 鸿狐大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
一分钟科普,哪能购买微信金花房... 美猴王牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡...
正版授权!游戏推荐斗牛房卡出售... 正版授权!游戏推荐斗牛房卡出售雷霆大厅/微信链接房卡从哪里获取雷霆大厅是一款非常受欢迎的游戏,咨询房...
推荐一款!金花房卡官网老神兽/... 微信游戏中心:老神兽/海贝大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
玩家攻略,金花房卡批发价天王大... 玩家攻略,金花房卡批发价天王大厅/微信链接房卡销售购买Sa9Ix苹果iPhone 17手机即将进入量...
一分钟了解!牛牛房卡游戏代理火... 您好!微信火狐大厅/新超圣大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(火狐大厅/新...
终于发现!我买炸金花房卡链接,... 微信游戏中心:炸金花房卡,添加微信【71319951】,进入游戏中心或相关小程序,搜索“微信炸金花房...
一分钟了解,微信斗牛房卡如何购... 新乐乐金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房...
玩家攻略,金花房卡出售玄龙大厅... 今 日消息,玄龙大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...