堆
堆,这里单指数据结构中的堆。
它可以解决两个重要的问题:1 排序 2 优先级队列
为什么有了快速排序还要用堆排序呢?这是因为堆排序对n个元素排序,所花的时间不会超过O(nlogn)。
下面说一下我个人的感觉,有些时候,我们为了方面或者说偷懒,我们喜欢采用线性的结构进行排序,但是我们也经常遇到当大规模数据进行排序的时候,这个时候O(n*n)的时间复杂度是等不起的。而堆本质上是将线性结构的数据预处理成树形结构,从而将排序的查询限定在树高范围之内。不能不说这是伟大的创造。
优先级队列:这是一种支持随意插入和最小(最大)提取元素的数据结构,本来它是可以采用任意的形式实现的,我们可以用任意的排序来实现最小元素的提取,但是这样操作n次,时间复杂度会是O(n*n),所以才有了用堆来实现优先级队列的方案,可以说优先级队列和堆有不可分割的羁绊。
其实堆排序可以用优先级队列来实现的,将要排序的元素依次插入到优先级队列后,再一一提取出来。为什么还要提出堆排序呢?因为道高一尺魔高一丈,优先级队列毕竟还要至少和原数据等量的空间复杂度,而堆排序就很好的避免了这一点,用了常量空间就解决了这一问题。
以前不去想这些问题,是因为觉得能用就行了,最近感觉有时知其然而不知其所以然就会很迷茫,遇到实际问题解决起来比较吃力。其实堆就是一种思想,至于你怎么建立堆,怎样维持堆性质,也有很多种方法,只要理解了堆的本质,遇到实际中的问题才会去想怎样能更高效地解决它,才会联想到堆。