任务
实现一个堆,实现插入、寻找最小值、任意修改元素、删除任意元素。
说明
由于堆是完全二叉树(或者说类完全二叉树,关于二叉堆,详情请见:binary heap)。我们使用小标从1开始的数组来表示树,1代表根节点,对于每个节点i,它的左节点为 i 2,右节点为 i 2 + 1,父节点为 i / 2;
我们使用数组heap[]
来记录堆中的元素。使用id[]
和pos[]
来分别记录修改操作中堆中位置为i的元素是第几个插入的和删除操作中第i个插入的元素在堆中的位置。
实现堆核心函数为up(i)
和down(i)
,up(i)
使堆中的节点不断“上升”,相反,down(i)
使堆中的节点不断“下沉”。
在插入一个值value
时,我们将它加入堆的最底层,然后通过比较确定是否“上升”;删除元素时,我们将该元素修改为负无穷大,然后使其上浮到根,最后删除堆顶元素。
注:堆顶元素(根节点)小标从0开始也是一样的,对于每个节点i,它的左节点为i 2 + 1, 右节点为 i 2 + 2,父节点为 (i - 1) / 2。
接口
- 结构体: BinaryHeap
- 成员变量:
int n 堆当前元素个数
int counter 加入堆中的元素个数
int heap[] 堆中的元素
int id[] 堆中位置为i的元素时第几个插入堆的
int pos 第i个插入堆中的元素在堆中的位置- 成员函数:
BinaryHeap(); 构造空堆
BinaryHeap(int array[], int offset); 将数组中的元素按顺序插入和构造的堆
void push(int v); 插入元素
int pop(); 删除栈顶元素
int get(); 获取第i插入堆中的元素值
void modify(); 修改第i个元素为value
void delet(int i);
代码
1 | const int MAXSIZE = 100000; // the size of binary heap |
有问题?发送 issues 给我~