二叉堆

二叉堆是一个完全二叉树,分小根堆与大根堆

小根堆:所有的父节点都比其子节点

大根堆:所有父亲节点都比其子节点大(感觉自己在说废话)

以下的操作都相对于小根堆

上浮(向堆中加数,但保持小根堆的性质)操作:

设:(这个节点的小标为i) 与自己的父亲节点进行比较,因为是完全二叉树,所以其父亲节点的下标为i/2,依次进行比较,如果大了就交换这两点的信息

下沉(删除堆的跟节点,并保持堆的性质)操作:

将堆顶元素切换成堆尾元素,再下沉该元素,与其子节点比较取最小值,交换两点信息,直到下沉到叶子节点或到对应位置时结束操作

如何用堆反复求出一组数的中位数:

用两个堆维护两组数,一个小根堆,一个大根堆,保证两堆中的元素个数的差值为1,当元素差值为2的时候就将大根堆的堆顶元素放进小根堆中(所有元素一开始都加进大根堆)

然后遇到要输出中位数时,大根堆根节点即为中位数

瑞瑞的木板&合并果子(其实是为了凑字数才写的)

建立一个小根堆,当堆内元素大于等于2时,取最小的两个值合并(取根节点,删除,再取根节点),再将合并的值添回小根堆,反复操作(好像说完了)

(看到袁某人放了两张图来解释,突然有点想效仿一下).....

(算了,某“伟”人曾说过:博客自己看懂就行了,别搞的花里胡哨)

posted @ 2018-05-30 08:32  Tarjan_fjz  阅读(99)  评论(0编辑  收藏  举报