- 堆
- 性质:每个父节点都小于其子节点(最小堆)
- 数组实现:1是根节点 2x为x的左节点,2x+1为右节点
- up操作:将其本身与其父节点比较,如果小于父节点,交换
- down操作:将其本身与其子节点比较,与最小的交换
- 堆的建立:
for(int i=n/2;i;i--)down(i);此时时间复杂度为O(n) - 堆的插入和删除操作的时间复杂度都是O(log n)
- 基本操作:
- 插入一个数:
heap[++size]=x;up(size); - 求集合当中的最小值
heap[1] - 删除最小值
heap[1]=heap[size];size--;down(1); - 删除任意一个元素
heap[k]=heap[size];size--;down(size);up(size) - 修改任意一个元素
heap[k]=x;down(k);up(k);基本实现如下:
- 插入一个数: