知识大全 用 C# 实现带键值的优先队列[1]

Posted 类型

篇首语:惜时专心苦读是做学问的一个好方法。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用 C# 实现带键值的优先队列[1]相关的知识,希望对你有一定的参考价值。

用 C# 实现带键值的优先队列[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  首先 需要一个接口 用来获取键以及获取和设置值 如下所示

namespace Skyiv Util interface IKeyValue<T  K  V>   K GetKey(T x);  V GetValue(T x);  void SetValue(T x  V v); 

  接着 就是我们的带键值的优先队列 KeyedPriorityQueue<T K V> 登场了

using System;using System Collections Generic;

namespace Skyiv Util class KeyedPriorityQueue<T  K  V>   IComparer<T> parer;  IKeyValue<T  K  V> kver;  Dictionary<K  int> keys;  bool hasKey;  T[] heap;

  public int Count  get; private set;   public KeyedPriorityQueue(IKeyValue<T  K  V> kv) : this(null  kv)    public KeyedPriorityQueue(int capacity  IKeyValue<T  K  V> kv) : this(capacity  null  kv)    public KeyedPriorityQueue(IComparer<T> parer  IKeyValue<T  K  V> kv) : this(  parer  kv)  

  public KeyedPriorityQueue(int capacity  IComparer<T> parer  IKeyValue<T  K  V> kver)     this keys = new Dictionary<K  int>();   this parer = (parer == null) ? Comparer<T> Default : parer;   this kver = kver;   this hasKey = (kver != null);   this heap = new T[capacity];  

  public bool ContainsKey(K key)     return keys ContainsKey(key);  

  public void Update(T v)     if (!hasKey) throw new NotSupportedException();   if (typeof(T) IsValueType) throw new InvalidOperationException( T 不能是值类型 );   if (!ContainsKey(kver GetKey(v))) throw new ArgumentOutOfRangeException( v  v   更新优先队列时无此健值 );   var id = keys[kver GetKey(v)];   var cmp = parer Compare(v  heap[id]);   kver SetValue(heap[id]  kver GetValue(v)); // 注意: 这一句要求 T 是引用类型 不能是值类型    if (cmp <  ) SiftDown(id);   else if (cmp >  ) SiftUp(id);  

  public void Push(T v)     if (Count >= heap Length) Array Resize(ref heap  Count *  );   if (hasKey) keys[kver GetKey(v)] = Count;   heap[Count] = v;   SiftUp(Count++);  

  public T Pop()     var v = Top();   if (hasKey) keys Remove(kver GetKey(v));   heap[ ] = heap[ Count];   if (Count >  ) SiftDown(hasKey ? (keys[kver GetKey(heap[ ])] =  ) :  );   return v;  

  public T Top()     if (Count >  ) return heap[ ];   throw new InvalidOperationException( 优先队列为空 );  

  void SiftUp(int n)     var v = heap[n];   for (var n  = n /  ; n >   && parer Compare(v  heap[n ]) >  ; n = n  n  /=  )    heap[hasKey ? (keys[kver GetKey(heap[n ])] = n) : n] = heap[n ];   heap[hasKey ? (keys[kver GetKey(v)] = n) : n] = v;  

  void SiftDown(int n)     var v = heap[n];   for (var n  = n *  ; n  < Count; n = n  n  *=  )       if (n  +   < Count && parer Compare(heap[n  +  ]  heap[n ]) >  ) n ++;    if (parer Compare(v  heap[n ]) >=  ) break;    heap[hasKey ? (keys[kver GetKey(heap[n ])] = n) : n] = heap[n ];      heap[hasKey ? (keys[kver GetKey(v)] = n) : n] = v;   

cha138/Article/program/net/201311/15449

相关参考

知识大全 简述用C#实现优先队列方法

简述用C#实现优先队列方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  优先队列(priori

知识大全 利用InstallShield获取注册表键值的脚本

利用InstallShield获取注册表键值的脚本  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!U

知识大全 数据结构考研分类复习真题 第三章 栈和队列[14]

  算术表达式求值的流程其中OPTR为算术符栈OPND为操作数栈precede(operoper)是比较运算符优先级别的函数operate(opndoperopnd)为两操作数的运算结果函数(#表示运

知识大全 C#操作消息队列的代码

C#操作消息队列的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这是一个关于C#操作消息队

买卖队列的内容

买卖队列的内容按照价格优先、时间优先的交易规则,买方队列是委托价格从高到低的排序,如果委托价格相同,则委托时间在先的排序就在先;卖方队列则是是委托价格从低到高的排序,同样地,如果委托价格相同,则委托时

知识大全 使用微软消息队列实现C#进程间通信

使用微软消息队列实现C#进程间通信  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  顾名思义微软消

知识大全 浅析C#语言实现堆和队列数据结构

浅析C#语言实现堆和队列数据结构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  1线性聚集基础 

知识大全 用VB实现队列播放MP3

用VB实现队列播放MP3  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  队列播放MP就是在文件列

知识大全 栈和队列 - 队列 - 顺序队列

  顺序队列  顺序队列  ()顺序队列的定义  队列的顺序存储结构称为顺序队列顺序队列实际上是运算受限的顺序表  ()顺序队列的表示  ①和顺序表一样顺序队列用一个向量空间来存放当前队列中的元素  

知识大全 顺序队列

顺序队列顺序队列 ()顺序队列的定义  队列的顺序存储结构称为顺序队列顺序队列实际上是运算受限的顺序表()顺序队列的表示  ①和顺序表一样顺序队列用一个向量空间来存放当前队列中的元