读书人

用数组实现一个简略的heap(最大堆)结

发布时间: 2013-10-01 12:15:56 作者: rapoo

用数组实现一个简单的heap(最大堆)结构

make_heap函数用来从给定的任意顺序的数组创建一个最大堆。

push_heap函数向堆中压入一个新的数据,并维持堆的形态。

pop_heap函数取出堆中最大的元素,并将该元素从堆结构中剔除,维持堆的形态。


使用了定长数组作为基本的存储数据的结构,当数组空间满时,重新申请一个两倍长于当前数组的新数组,将元素复制过去。

heap.cpp

#include <iostream>#include "heap.cpp"using namespace std;int main(){heap p;int A[10] = {16, 14, 10, 8, 7, 9, 3, 2, 4, 1};p.make_heap(A, 10);p.push_heap(13);for(int i = 0; i < 10; i++)cout<<p.pop_heap()<<" ";}


最小堆的使用实例:

Find_Top_K问题:数组N中寻找最大的K个元素:

用前K[0...k-1]个元素,建立小顶堆K-Min-Heap;

遍历K...N-1元素,和堆顶元素比较:

小于跳过,

大于则替换堆顶元素,调整K-Min-Heap结构使之保持小顶堆特性;

K-Heap的操作时间为log2(k)


插入法建堆和上面代码中使用的调整法建堆效率是有差距的,插入法建堆指的是从一个元素的堆开始,依次向堆中插入数据,并调整堆,最后得到最大堆。调整法建堆的时间复杂度为:O(n),而插入法建堆的最坏时间复杂度为:O(nlgn)

读书人网 >编程

热点推荐