【问题标题】:Implementing Java Priority Queue实现 Java 优先级队列
【发布时间】:2010-04-24 02:04:18
【问题描述】:
public class PriorityQueue<T> {
 private PriorityNode<T> head, tail;
 private int numItems;

 public PriorityQueue(){
  numItems = 0;
  head=null;
  tail=null;
 }


 public void add(int priority, T value){
      PriorityNode<T> newNode = new PriorityNode<T>(priority,value);

      if(numItems == 0){
       head = newNode;
       tail = newNode;
      }
      else{
       head.setNext(newNode);
       head = newNode;
      }



     }

    }

其中 PriorityNode 定义为:

 public class PriorityNode<T> implements Comparable<T> {
     private T value;
     private PriorityNode<T> next;
     private int priority;

     public PriorityNode(int priority,T newValue){
      value = newValue;
      next = null;
      priority = 0;
     }

     public PriorityNode(T newValue){
      value = newValue;
      next = null;
      priority = 0;
     }

     public void setPriority(int priority){
      this.priority = priority;
     }

     public int getPriority(){
      return this.priority;
     }

     public T getValue(){
      return value;
     }

     public PriorityNode<T> getNext(){
      return next;
     }

     public void setNext(PriorityNode<T> nextNode){
      this.next = nextNode;
     }

     public void setValue(T newValue){
      value = newValue;
     }

           @Override
     public int compareTo(int pri) {
      // TODO Auto-generated method stub
        if(this.priority<pri){
           return -1;
        }
        else if(this.priority == pri){
           return 0;
         }
        else{
           return 1;
         }


     }


    }

我在使用 Comparator 和实现优先级队列时遇到很多困难 - 请指出正确的方向。

【问题讨论】:

  • 不完全清楚你的问题是什么。什么是“困难”?编译错误?出乎意料的结果?

标签: java priority-queue comparator


【解决方案1】:

不要使用树结构来实现优先级队列。使用heap。它更节省空间,需要更少的内存分配,并且对于大多数操作来说是 O(log(N))。

【讨论】:

  • 没错,但我正试图在考官向我提出这个问题之前完成这种类型的实施。
【解决方案2】:

关于比较器的实现,实现Comparator&lt;T&gt;Comparable&lt;T&gt;接口需要重写public int compareTo(T o)方法。

在给出的示例代码中,compareTo(T) 方法没有被覆盖(compareTo(int) 方法被定义,但不是相同的方法签名),因此,它可能会导致编译器错误。

【讨论】:

    【解决方案3】:

    我认为您对自己有点太苛刻了,优先级队列通过基于数组的堆有效地实现:更简单,更高效(阅读:连续内存区域)。

    【讨论】:

    • 那个链接是关于什么的?!
    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2012-11-26
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多