优先队列的应用 C++实现
生活随笔
收集整理的這篇文章主要介紹了
优先队列的应用 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)題。
- 上一篇: Linux 用户行为日志记录
- 下一篇: 首篇博文