c++ set,map,priority_queue的底层数据结构比较以及思考

问题来源
一道算法题,给定m次操作,可以是插入一个随机数据,可以是删除一个最小的数据,可以是输出展示一个最小的数据。

开始我是用的最基础的vector去做的,但是问题在于,每一次插入数据后需要重新排序,导致算法的时间复杂度很高,于是想到使用set数据结构,因为set是自动插入数据后从小到大排序的。
但是两个问题,第一是题目中可能会有重复数据,set会自动去重,会导致答案错误。
第二是仍然超时严重,只能过40%的测试案例

于是改换成优先队列priority_queue 完美通过

所以,引发一个思考,为什么priority_queue和set都是自动排序,但是时间复杂度相差很大。查询资料发现,set的实现数据结构是红黑树,而优先队列的实现数据结构是完全二叉树形式的堆。两者严格意义上都是二叉树的基础数据结构,而且都需要维持树的平衡。
在这里插入图片描述
在这里插入图片描述
红黑树笔者没有理解清除其具体的实现机理,但是***两者都需要在插入数据之后,再次调整树的结构,以实现平衡***。单从查询角度看,两者的效率是相同的,但是插入之后的调整树的方式,决定了时间复杂度的不同。(map的实现也是红黑树)

上述图片中,可以看到对于优先队列,插入数据是在最尾端,然后进行调整,并且数据可以被存放在数组中,

不得不承认,在降低时间复杂度上,优先队列非常的出色。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值