怎么理解优先队列和堆的关系?
简单来说:堆排序是一种排序算法,利用堆结构完成排序的功能;优先队列是一种数据结构,它是利用堆来实现。
具体来说,堆排序过程:建堆→堆顶就是最大(或小)值,然后堆顶跟最后一个元素交换→调整堆,反复这个过程,直到堆里面所有元素都交换好;
而优先队列:建堆→堆顶元素就是优先级最高(或最低)的元素了,可以利用优先级这个数据结构来描述某个问题,比如有一批不断输入的日期,我想要在任何时刻都能以O(1)的速度得到已经输入的日期中的最早日期,那么就可以用优先队列这个数据结构存储日期元素啦。
怎么理解二叉堆和性质?
二叉堆可以认为是一个完全二叉树,把元素列成一个树的形状,元素一层一层的往下放,直到放不下为止。
二叉堆性质:
简单来说:堆的每个子节点都要小于自己父节点的值,反之亦可,主要是根据自己对于优先级的定义。
注意:并不是每个父节点都要大于每个子节点,如图第三层右节点16
就比第四层左节点19
要小,但依然成立二叉堆的性质。可以得出结论:子节点只需小于自身父节点即可。