优先队列学习笔记
思想改变世界,技术连接你我。果果,今天过得好吗? —Joly Zhang |
---|
-
基于大根堆的最大堆,支持的操作有:
- INSERT(S, x):把元素x插入到集合S中。
- MAXIMUM(S):返回S中具有最大关键字的元素。
- EXTRACT-MAX(S):去掉并返回S中具有最大关键字的元素。
- INCREASE-KEY(S, x, k):将元素x的关键字增加到k,这里的k值不能小于x的原来关键字的值。
#define MAX_INT ((unsigned)(-1)>>1)
#define MIN_INT (~MAX_INT)
/**
基于大根堆的最大优先队列
--Joly Zhang
date:09/21/2016
**/
int heap_maximum(int A[])
{
return A[1];
}
/*
功能:抽取有最大键值的元素。
原理:
step1:记录根节点的为最大元素。
step2:用最后一个元素覆盖根节点。
step3:调整大根堆。
*/
int heap_extract_max(int A[], int *heap_size)
{
if (*heap_size < 1)
{
throw"heap underflow";
}
int max = A[1];
A[1] = A[*heap_size];
--(*heap_size);
max_heapify(A, *heap_size, 1);
return max;
}
/*
功能:增大元素i的键值到key。
原理:
step1:用key替换i元素的键值。
step2:使键值key沿路径上升,直至找到合适的位置
*/
void heap_increase_key(int A[], int heap_size, int i, int key)
{
if (key < A[i])
{
throw"new key is smaller than current key";
}
A[i] = key;
while (i > 1 && A[i] > A[PARENT(i)])
{
int temp = A[i];
A[i] = A[PARENT(i)];
A[PARENT(i)] = temp;
i = PARENT(i);
}
}
/*
功能:向最大优先队列中差入一个元素
原理:
step1:先在最后增加一个键值为MIN_INT的元素。
step2:将该元素的键值增加至key。
*/
void max_heap_insert(int A[], int * heap_size, int key)
{
if (*heap_size == MAX_SIZE)
{
throw"heap overflow";
}
++(*heap_size);
A[*heap_size] = MIN_INT;
heap_increase_key(A, *heap_size, *heap_size, key);
}
后续将分享二项堆和斐波那契堆的学习笔记,敬请期待!