在我们的计算机科学里面堆往往是指两个对象,一个是数据结构中的一个树形结构,另外一个是动态内存中堆和栈。
我这里要说的是前一个。
对于堆,它有鲜明的性质,大顶堆和小顶堆都个性鲜明。堆实际上也是一个完全二叉树,所以在实现上用一维数组存储就可以了。
这和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个整数。
浙公网安备 33010602011771号