堆 [用来维护集合最值的高效数据结构]
定义:
堆是一种特殊的完全二叉树,它可以分为两类,分别是大顶堆和小顶堆。
在小顶堆中,每个父节点的值都要小于其两个子节点的值,大顶堆则相反。

堆实际的存储结构和结构操作。之前我们说过,它其实就是一个数组,
在插入元素时,从数组的末尾放入元素,而删除元素时,是从数组的头部移出元素。

如果我们把堆的存储结构看成是一个队列的话,那堆就是一种可以灵活控制元素出队优先级的数据结构,
我们管这种结构就叫做优先队列。堆只是实现优先队列的其中一种方式,当然也是最普遍的方式。

堆有两种基本的结构操作,插入操作和删除最值操作。在插入操作中,我们是将新元素放到整个堆结构的末尾,
然后对新插入的元素执行向上调整的操作,一直调整到满足堆的结构性质为止。
而在删除操作中,我们是将堆顶元素弹出以后,再将堆的尾部元素移动到堆顶,对其执行向下调整的操作,
一直调整到满足堆的结构性质为止。

好了,那我们来总结一下堆排序的流程:在原数组上建立堆结构将堆顶元素与堆末元素进行调换,
再对堆顶元素进行向下调整经过 n 轮操作以后,数组中的元素就有序了


假设,我们想在大量的数据,如 100 亿个整型数据中,找到值最大的 K 个元素,K 小于 10000。你会怎么做呢?
1. 归并排序
2. K 轮查找

数据结构个人理解:
在解决实际问题时,我们一定是通过某些性质来反推我们需要的数据结构。因此准确理解各种数据结构的性质,才是将理论应用到实践的要点。

因此,只有从问题性质出发选择合适的算法数据结构,才能彻底增强你解决实际问题的能力。届时,你所思考的将不再是使用某一个数据结构解决问题,
而是真正学会使用某一类数据结构解决问题。好了,今天就到这里了,道阻且长,行则将至,我是胡光,我们下期见。


纸上学来终觉浅,觉知此事需躬行
原文地址:https://www.cnblogs.com/dreamHighMjc/p/15074367.html