vector与堆

今天在看a*寻路的代码时看到了pop_heap的操作,之前都是用优先权队列来做类似的事,所以补一下知识

vector<int> v;

make_heap(v.begin(),v.end());///将当前vector构造成一个最大堆

vector不能从头部插入或删除元素,所以删除最大元素操作:

pop_heap(v.begin(),v.end());///第一步,将最大元素放到末尾,

v.pop_back();///第二步弹出最大元素

插入一个元素

v.push_back(x);

push_heap(v.begin(),v.end());///执行这一步时,之前的vector必须时保持堆形态,如果不是堆形态会报错

sort_heap(v.begin(),v.end());///堆排序,vecot必须时堆形态

总结:make_heap构造一个堆,其他堆操作都需要保证vector是堆形态

堆的应用:动态计算一个序列的中位数

维护一个最大堆,一个最小堆,当插入一个元素时,插入到元素个数较少的那个堆中

与优先权队列的效率比较:

执行1000w次插入和删除操作

优先权队列:33s

vector+heap:37s

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容