您的位置:首页 > 教育 > 培训 > 精准客户电话号码购买_php可以开发动态网站_推广网站免费_如何开网店

精准客户电话号码购买_php可以开发动态网站_推广网站免费_如何开网店

2025/4/19 16:49:35 来源:https://blog.csdn.net/apple_61439616/article/details/147292047  浏览:    关键词:精准客户电话号码购买_php可以开发动态网站_推广网站免费_如何开网店
精准客户电话号码购买_php可以开发动态网站_推广网站免费_如何开网店

目录

  • 前言
  • 基本结构
  • 如何设置默认大小堆
  • 底层实现
    • 仿函数的使用
    • 向上调整算法
    • 向下调整算法
    • 其他接口
  • end

前言

priority_queue的介绍
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。

注意: 默认情况下priority_queue是大堆。

基本结构

关于优先级队列实际上就是一个堆,堆分为大根堆和小根堆
在这里插入图片描述

  • 这里列举大根堆

关于堆这个数据结构我在【手撕数据结构】二叉树和堆这篇文章里已经详细讲解过,如果还不了解的可以去看看这篇文章

如何设置默认大小堆

这里我们提出一个叫仿函数的概念:
看看库里面的priority_queue

在这里插入图片描述

  • 其实仿函数就是一个类,和容器适配器差不多,仿函数仿在哪里,我们知道函数调用都是通过()来标记这是一个函数,所以这个类里面就重载了()运算符
    在这里插入图片描述

注意:
1.提供Greater(大于)是小根堆
2.提供Less(小于) 是大根堆

底层实现

仿函数的使用

	template<class T, class Contain = vector<T>, class Compare = Less<T>>class Priority_queue{Compare com; 
  • 定义一个仿函数对象com
if (child + 1 < _con.size() && com(_con[child], _con[child + 1]))- 这里就是使用对象的运算符重载()达到大小相比

向上调整算法

  • 这个原理我也在以前的文章中讲过,这里就不再详细讲解了,请往上面的链接去看
void AdjustUp(int child)
{int parent = (child - 1) / 2;while (child > 0)	//测试一下{if (com(_con[parent], _con[child])){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}

向下调整算法

	void AdjustDown(int parent){int child = 2 * parent + 1;while (child < _con.size()){if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){child++;}if (com(_con[parent], _con[child])){swap(_con[parent], _con[child]);parent = child;child = 2 * parent + 1;}else{break;}}}

其他接口

		void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1);}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}const T& top(){return _con[0];}bool empty(){return _con.empty();}int size(){return _con.size();}
  • 根据复用vector这个容器适配器接口就行, pop是堆的删除所以是删除堆顶,然后重新调整堆的特征结构
  • 插入从最后插入,也是要调整结构。
  • 具体原理图解看以前的文章,前面我已经给了链接。

end

感谢大家的阅读,希望对你们有帮助

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com