优先队列
普通队列:先进先出,后进后出。
优先队列:出队顺序和入队顺序无关;和优先级有关。
入队与普通队列一样,不过不同在出队这里。
动态选择优先级高的任务进行执行。
举个例子:比如医院中的病人,医生不可能知道直接对医院中的病人进行优先级进行排序,因为每天都有可能出现新的病人,所以医生就要动态的对新来的病人进行优先级的重新判断。
优先队列的接口方法:(和普通队列一样)
优先队列与普通队列的方法区别主要在于出队与获取队首元素的方法上。这两个方法的元素都是优先级最高的。
堆
堆也是一种二叉树(完全二叉树)
什么是完全二叉树呢?(按顺序排列成树的形状)
二叉树不一定是一棵满的二叉树,不满的部分为整棵树的右下侧。
正如上图的每个节点的序号一样,从第一层开始插入节点,接着对下面每一层从左到右的顺序插入节点,这样就使得,整棵树的右边节点肯定会有叶子节点。
最大堆:
堆中每个节点的值总是不大于其父节点的值 。堆中的最大元素为根节点元素。左右节点也都是一棵二叉堆。
最小堆:
堆中的每个节点都要小于它的子节点。左右节点也都是一棵二叉堆。
二叉堆节点的大小与该节点的层次没有关系。
由于堆是按照顺序排列的,所以可以利用数组作为底层实现堆。
以最大堆为例进行分析:
二叉堆的存储顺序图如下:
利用这种顺序结构,我们就可以利用数组来存储二叉堆。
不过数组的是从下标0开始的,而二叉堆以1代表根节点。
二叉堆每个节点的索引关系公式:
而利用数组存储的话,数组又是以下标0开始的,所以关系公式变为如下:
对于(i - 1)这样计算出来的节点索引值就能与数组索引关系对应上了。