优先队列 (堆的应用)- 编程珠玑

很久很久以来,我都忽视了这一重要的数据结构。也不知道stl中专门有这样一个容器 priority_queue. 自然,对用到可能用到优先队列这种数据结构的地方也不是很敏感。

优先队列:即提供push() 和 pop()两个接口的数据结构,push()向队列中插入一个数,pop()取出队列中最优先的数据。
《编程珠玑》中对比了三种优先队列实现方式的复杂度 , 无序数组,堆,有序数组三者中,堆得时空复杂度平均最优。

用到优先队列的地方:凡是需要取出集合中最***元素的地方。
eg1: 构建霍夫曼编码
     构建霍夫曼编码需要找到结点集合中频率最小的两个结点。然后合并结点插入到集合。依次循环。
eg2:一些任务调度算法
     比如系统中线程调度算法,有的是按照优先级来调度的。
eg3:合并n个有序文件为一个有序文件。
     首先把n个有序文件的第一个元素都提取出来,放入优先队列中,然后取出最小的元素。然后再插入元素到优先队列,在取出最小元素。

eg4:由于优先队列内部一般是采用堆实现的,所以,所有适用于堆得算法,都适用于优先队列。
         比如,排序,找中位数,找最大的K个数等。

你可能感兴趣的:(数据结构,编程,算法,任务调度)