http://www.baidu.com/s?wd=c%23%E4%BC%98%E5%85%88%E7%BA%A7%E9%98%9F%E5%88%97&ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&rsv_pq=efc07de5000f3769&rsv_t=cfc2XQdw6vLpqMbC%2BUKjZKG3pLY5QhlmymVHc2VGh8avPmrRmgHn5bRXbco&bs=%E4%BC%98%E5%85%88%E7%BA%A7%E9%98%9F%E5%88%97

优先队列(priority queue) 是很重要的数据结构。我在做 ACM 题时就经常要用到她。C++
STL 就包括 priority_queue 。Java 也有PriorityQueue 类。遗憾的是,.NET
Framework Base Class Library
 中并不包括优先队列。于是,我只好自己用 C# 语言写一个,如下所示:

using System;
using System.Collections.Generic; namespace Skyiv.Util
{
class PriorityQueue<T>
{
IComparer<T> comparer;
T[] heap; public int Count { get; private set; } public PriorityQueue() : this(null) { }
public PriorityQueue(int capacity) : this(capacity, null) { }
public PriorityQueue(IComparer<T> comparer) : this(16, comparer) { } public PriorityQueue(int capacity, IComparer<T> comparer)
{
this.comparer = (comparer == null) ? Comparer<T>.Default : comparer;
this.heap = new T[capacity];
} public void Push(T v)
{
if (Count >= heap.Length) Array.Resize(ref heap, Count * 2);
heap[Count] = v;
SiftUp(Count++);
} public T Pop()
{
var v = Top();
heap[0] = heap[--Count];
if (Count > 0) SiftDown(0);
return v;
} public T Top()
{
if (Count > 0) return heap[0];
throw new InvalidOperationException("优先队列为空");
} void SiftUp(int n)
{
var v = heap[n];
for (var n2 = n / 2; n > 0 && comparer.Compare(v, heap[n2]) > 0; n = n2, n2 /= 2) heap[n] = heap[n2];
heap[n] = v;
} void SiftDown(int n)
{
var v = heap[n];
for (var n2 = n * 2; n2 < Count; n = n2, n2 *= 2)
{
if (n2 + 1 < Count && comparer.Compare(heap[n2 + 1], heap[n2]) > 0) n2++;
if (comparer.Compare(v, heap[n2]) >= 0) break;
heap[n] = heap[n2];
}
heap[n] = v;
}
}
}

如上所示,这个 PriorityQueue<T> 泛型类提供四个公共构造函数,第一个是无参的构造函数,其余的构造函数允许指定优先队列中包括的初始元素数(capacity)、如何对键进行比较(comparer)。

这个程序使用堆(heap)来实现优先队列。所以,所需的空间是最小的。Count 属性和 Top 方法的时间复杂度是 O(1),Push 和 Pop 方法的时间复杂度都是 O(logN)。

我曾经用 List<T> 泛型类实现过一个优先队列,请参见我的博客 Timus1016.
A Cube on the Walk
 。虽然更简单,程序代码只有 23 行,但是效率不高,其 Push 和 Pop 方法的时间复杂度都是 O(N)。

最新文章

  1. 关于Delphi错误:Cannot make a visible window modal
  2. 关于调整input里面的输入光标大小
  3. [WPF]UserControl的MouseWheel事件触发
  4. python2.7.9基础学习
  5. servlet注解@PostConstruct与@PreDestroy
  6. DuiLib事件分析(一)——鼠标事件响应
  7. 如何生成一副Poker
  8. 通过WebClient/HttpWebRequest实现http的post/get方法
  9. C程序设计语言练习题1-12
  10. elasticsearch 配置说明
  11. 进程cookie与硬盘cookie
  12. rails应用ajax之二:使用rails自身支持
  13. C# 委托链(多播委托)
  14. 自学PYTHON分享 --基础1
  15. 认识一下margin
  16. PowerShell 命令行调试指引(转)
  17. npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted,)解决方法
  18. 尚硅谷springboot学习20-web开发简介
  19. django创建一个简单的web站点
  20. 【MUI框架】学习笔记整理 Day 2

热门文章

  1. 2016/07/11 PHP接口的介绍与实现
  2. EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计
  3. Carriage-Return Line-Feed
  4. openstack之路:虚拟机的配置
  5. PAT 天梯赛 L1-049. 天梯赛座位分配 【循环】
  6. Linux下MySQL、Apache、PHP源码安装全程实录(CentOS 6.4)
  7. uboot显示logo的时候发现颜色偏黄【学习笔记】
  8. UVA11752 The Super Powers —— 数论、枚举技巧
  9. Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister —— DP
  10. 分布式锁(Redis实现)