日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

优先队列的应用 C++实现

發(fā)布時(shí)間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 优先队列的应用 C++实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

優(yōu)先隊(duì)列的應(yīng)用 C++實(shí)現(xiàn)

優(yōu)先隊(duì)列可以用堆來(lái)實(shí)現(xiàn), 堆底層可以用數(shù)組表示,
通過(guò)索引關(guān)系,可以表示成一顆二叉完全樹

C++的STL提供了相應(yīng)的容器適配器
包含在queue頭文件中

下面通過(guò)一道題來(lái)看如何使用它

給定一個(gè)字符串,請(qǐng)將字符串里的字符按照出現(xiàn)的頻率降序排列。

string frequencySort(string s) {
}

首先,統(tǒng)計(jì)字符出現(xiàn)的頻率,通過(guò)map容器可以很簡(jiǎn)單的統(tǒng)計(jì)出來(lái)

map<char, int> mp;for (auto e : s)
{++mp[e];
}

然后我們需要構(gòu)建一個(gè)優(yōu)先隊(duì)列,而且要指定優(yōu)先隊(duì)列的排序方式
因此我們定義了一個(gè)自己的結(jié)構(gòu)體, 并定義了<操作符(降序定義小于號(hào),升序大于號(hào)),

struct Node
{Node(const pair<char, int> &val) : p(val) {}pair<char, int> p;
};bool operator<(const Node &a, const Node &b)
{return a.p.second < b.p.second;
}

然后把鍵值對(duì)放入優(yōu)先隊(duì)列中

priority_queue<Node, vector<Node>, less<Node>> pq;
for (auto e : mp)
{pq.push(make_pair(e.first, e.second));
}

要用的時(shí)候,依次取出來(lái)就是了,每次取出的都是里面最大(或最小)的

string res;
while (!pq.empty())
{for (int i = 0; i < pq.top().p.second; ++i)res.push_back(pq.top().p.first);pq.pop();
}

還有好幾個(gè)類似的題,都可以用這種方式解決

比如 :

  • leetcode-692
  • leetcode-378
  • leetcode-373
  • leetcode-347

下面是堆的實(shí)現(xiàn), 還是建議掌握的

#include <vector>
using namespace std;template <class T>
class Heap
{public:Heap(size_t maxElems){h = new HeapStruct;h->Elems = new T[maxElems + 1];h->Capacity = maxElems;h->size = 0;}~Heap(){destroy();}void insert(T x){size_t i;if (isFull()){return;}for (i = ++h->size; i / 2 > 0 && h->Elems[i / 2] > x; i /= 2){h->Elems[i] = h->Elems[i / 2];}h->Elems[i] = x;}T deleteMin(){size_t i, child;T minElems, lastElems;if (isEmpty())return h->Elems[0];minElems = h->Elems[1];lastElems = h->Elems[h->size--];for (i = 1; i * 2 <= h->size; i = child){child = i * 2;if (child != h->size && h->Elems[child + 1] < h->Elems[child])++child;if (lastElems > h->Elems[child])h->Elems[i] = h->Elems[child];elsebreak;}h->Elems[i] = lastElems;return minElems;}bool isFull(){return h->size == h->Capacity;}bool isEmpty(){return h->size == 0;}T findMin(){return h->Elems[1];}private:void destroy(){delete h->Elems;delete h;}void makeEmpty() {}struct HeapStruct{size_t Capacity;size_t size;T *Elems;};HeapStruct* h;
};

轉(zhuǎn)載于:https://www.cnblogs.com/kwebi/p/9811990.html

總結(jié)

以上是生活随笔為你收集整理的优先队列的应用 C++实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。