代码改变世界

我的优先队列改进了

2008-09-10 09:13  JimLiu  阅读(829)  评论(0编辑  收藏  举报

昨天写的那个泛型优先队列

http://www.cnblogs.com/jimnox/archive/2008/09/09/1287872.html

缺点是使用的时候只能大者先出队,需要小者先出队的时候比较麻烦——如果是自定义类型,可以靠反着实现IComparable<T>接口来搞定,但是未免牵强,破坏了类的逻辑性。如果是类库自带类型,就只能重新包装后再使用,比较不爽。

今天改进了下,在堆算法中加了个带布尔参数的重载,决定要不要降序排列,若是,则建小顶堆,默认是升序,即大顶堆。

这样就容易了,小顶堆的优先队列小者先出队,大顶堆的优先队列大者先出队。

这样优先队列的构造函数就多个重载,带个布尔量,决定要不要升序出队,默认为false,即降序出队。

因为我们学校的OJ只能支持C#2.0(其实那个系统就是我写的,我懒得在服务器上装3.5而已),所以为了我做ACM题目的时候能用上(虽然通常为了速度都用C/C++),我没用3.5的特性。否则可以在堆的算法中参数直接带上一个Expression<.......>这样的一个二元参数的比较表达式,这样就更易用了,因为T就不用实现IComparable<T>接口了。

想来想去还是没把PriorityQueue<T>实现IEnumerable和IEnumerable<T>接口,因为遍历优先队列是有破坏性的,就是必须弹出堆顶元素(也许是我没想到有没有直接在二叉堆上遍历的方法),所以实现IEnumerable的空间开销就是O(n),时间开销高达O(nlogn)我觉得这样遍历没有意义,而且本来通常我们用PQ的时候就只关注队首,谁没事遍历个队列啊。

代码在这里下载,里面还包括前段时间写的并查集和泛型字母树(26子节点,忽略大小写,需要的朋友可以自己改),项目文件是Visual Studio 2008的,但程序是C#2.0的。