最小堆
定义
每个节点的值都小于或等于其子节点的值的完全二叉树
插入节点
将元素X插入最小堆,可以在树的下一个空闲位置创建一个空穴。如果X可以放在空穴之中而不破坏堆的序,则插入完成。否则就执行交换空穴和他的父节点上的元素的操作,不断的执行该操作,直到X可以被放入空穴;
删除节点
删除其根节点上面的元素,然后去调整整个最小堆。
删除根节点元素之后,将堆中最后一个元素X移动到根节点的位置,然后判断堆的序是否被破坏,如果被破坏,则将其位置位置进行调整。执行的操作是不断地交换该节点和它的两个儿子节点之中较小者的位置。
最小堆的实现
vector+unordered_map
使用vector表示最小堆,可以发现,对于任意位置为i的元素
- 左子节点位置为2i+1;
- 右子节点位置为2i+2;
- 其父节点位置为(i-1)/2 (i>0)
相比于链表表示的优点是: 节省空间,并且更容易实现节点的删除和插入等从操作
具体功能
std::function< void() > 和 std::bind()
bind函数可以看做一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来适应原对象的参数列表