在我们的计算机科学里面堆往往是指两个对象,一个是数据结构中的一个树形结构,另外一个是动态内存中堆和栈。

我这里要说的是前一个。

对于堆,它有鲜明的性质,大顶堆和小顶堆都个性鲜明。堆实际上也是一个完全二叉树,所以在实现上用一维数组存储就可以了。

这和BST有明显的区别。常用的还是二叉堆。

关于堆常用的可能是堆排序和优先队列了。

树形结构往往和分治等算法有关系,所以算法效率往往都不错,常用操作可能都在O(logn)级别,这比O(n)就优秀了很多了。

而且堆还有明显的特质是它能够保持前面计算的中间结果,使得后面的计算不需要每次从头来,这个很多其它算法都有点神似。

常用的操作如下:

1.建堆 build_heap:这个依赖于heap adjust or heapify操作,复杂度O(nlogn)

2.heap adjust:复杂度O(logn)

3.heap sort:复杂度O(nlogn) build_heap+head adjust

heap sort使用相对少,一般来说quick sort更加优秀。

heap sort只用一个辅助空间,而且排序的上限是o(nlogn),这算是它对上快排的优势之一。 

说几个sample或者应用:

1.拔苗助长问题:

一个可爱的农夫,有一块地,每个苗都有自己的高度,第i个苗的高度为b[i]。农夫每次把最矮

的苗拔高成原来高的两倍。请问:农夫拔的第100次,苗被拔后的高度为多少?

2.从1000万个整数中找出最小的10个整数。 


 



posted on 2008-12-23 00:42  shawnliu  阅读(330)  评论(0)    收藏  举报