C++实现优先队列——最小堆,d路堆及配对堆

本文介绍了C++中实现优先队列的方法,特别是针对Huffman树的最小堆和配对堆。通过实验比较了三种优先队列在构建1000000个数据的Huffman树时的时间性能,结果显示静态数组在速度上有显著优势,尽管会占用更多空间。
摘要由CSDN通过智能技术生成

优先队列实现,此处的优先队列是用于Huffman树实现的(具体参考上一篇文章)。所以用于比较的都是huffman树的node的频率,希望读者见谅。

最小堆(二叉):

template <typename T>
class MinHeap
{
public:
	MinHeap(int cap );
	~MinHeap();
public:
	bool insert(pTree val);
	bool remove(pTree data);
	void print();
	int size;
	T getTop();
	bool createMinHeap(pTree a[], int length);

private:
	int capacity;

	T * heap;
private:
	void filterUp(int index);
	void filterDown(int begin, int end);
};

template <typename T>
MinHeap<T>::MinHeap(int cap )
:capacity(cap), size(0), heap(nullptr)
{
	heap = new pTree[capacity];
};

template<typename T>
MinHeap<T>::~MinHeap()
{
	delete[]heap;
};

template <typename T>
void MinHeap<T>::print()
{
	for (int i = 0; i < size; i++)
		cout << heap[i]->freq << " ";
};

template <typename T>
T MinHeap<T>::getTop()//返回最小值
{
	if (size != 0)
		return heap[0];
};

template <typename T>
bool MinHeap<T>::insert(pTree val)//插入函数
{
	if (size == capacity)
		return false;
	heap[size] = val;
	filterUp(size);
	size++;
	return true;
};

template <typename T>
void MinHeap<T>::filterUp(int index)//由上至下进行调整
{
	pTree value = heap[index];

	while (index > 0)
	{
		int indexParent = (index-1) / 2;
		if (value->freq >= heap[indexParent]->freq)
			break;
		else
		{
			heap[index] = heap[indexParent];
			index = indexParent;
		}
	}
	heap[index] = value;
};


template<typename T>
bool MinHeap<T>::createMinHeap(pTree a[], int length)
{
	if (length > capacity)
		return false;
	for (int i = 0; i < length; i++)
	{
		insert(a[i]);
	}
	return true;
};


template<typename T>
bool MinHeap<T>::remove(pTree data)//删除元素
{
	if (size == 0)
		return false;
	int index;
	for (index = 0; index < size; index++)
	{
		if (heap[index]== data)
			break;
	}
	if (index == size)
		return false;

	heap[index] = heap[size - 1];
	size--;
	filterDown(index, size);

	return true;
};

template<typename T>
void MinHeap<T>::filterDown(int current, int end)//由下至上进行调整
{

	int child = current * 2 + 1;
	pTree value = heap[current];

	while (child <= end)
	{
		if (child < end && heap[child]->freq > heap[child + 1]->freq)
			child++;
		if (value->freq<heap[child]->freq)
			break;
		else
		{
			heap[current] = heap[child];
			current = child;
			child = child * 2 + 1;
		}
	}
	heap[current] = value;
};



配对堆:

class PairNode
{
    public:
        pTree element;
        PairNode *leftChild;
        PairNode *nextSibling;
        PairNode *prev;
        PairNode(pT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值