您的位置:首页 > 其它

对优先队列的一些想法--笔记贴

2012-11-29 13:29 211 查看
先明确,优先队列的基本需求:访问最小元素。插入和删除的速度也要足够。

可以作为选择的数据结构:

1.链表。链表可以保证常量时间在表头插入,但是删除需要遍历链表。如果保持链表是排序的,即在插入的时候做些手脚,那么会使得插入操作时遍历链表,时间又上升到了O(N)。暂时弃之。

2.二叉搜索树。可以使得时间复杂度为O(logN),但是不够随机的情况之下,会使得时间复杂度变为O(logN),这时候的树变成了链表。

3.二叉堆。用数组实现。两个属性:结构属性和排序属性,使得它能胜任。这个也是典型的实现方法。

下面是deleteMin的具体实现:

template <class T>
void BinaryHeap<T>::deleteMin()
{
if(!isEmpty())
throw UnderflowException();
array[1] = array[HeapSize--];//将最后一个元素放到根部,再将容量减1;第0个元素是弃之不用的。
downPercolate(1);//调用向下调整函数,将heap重新调整成小根堆。
}
template <class T>
void BinaryHeap<T>::downPercolate(int parent)
{
T temp = array[parent];
int child;
for(; child <= HeapSize; parent = child)
{
child = 2 * parent;
if(child != HeapSize && array[child] > array[child+1])
child ++;
if(array[child] < temp)
array[parent] = array[child];
else
break;
}
array[parent] = temp;//最后,填写temp
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: