普通队列:先入先出
优先队列:依照元素优先级的大小取出数据
现实世界中,许多情况是可以插队的(根据权重)
应用:
游戏中AI优先攻击哪个敌人(根据经验高低、血多少等)
操作系统处理应用
在第N个元素中选出前M个元素
使用排序可在O(NlogN)内解决
使用优先队列可在O(NlogM)内解决(N和M相差越大优化越明显)
快速获取Top10最热门的搜索关键词(Top K问题)
求中位数
用不同的数据结构实现优先队列:
普通数组,入队O(1),出队O(n)
顺序数组,入队O(n),出队O(1)
堆的入队和出队的效率都是O(lgn)
对于总共N个请求,普通数组或顺序数组,最差情况O(n^2),而堆是O(nlgn)
堆是一种特殊的树,需满足:
1)是一颗完全二叉树
2)每个节点的值都必须大于等于(或小于等于)其子树中每个节点的值