Binary Heap ADT 的 increaseKey() 方法

Posted

技术标签:

【中文标题】Binary Heap ADT 的 increaseKey() 方法【英文标题】:increaseKey() method for Binary Heap ADT 【发布时间】:2013-12-17 11:41:00 【问题描述】:

我必须在二叉堆优先级队列 ADT 中实现 increaseKey() 方法,但我就是不知道该怎么做。 BinaryHeap 只接受扩展 Comparable 的对象,这允许我使用 a.compareTo(b),但没有明显的方法来增加对象的键。

public class PrQueue <E extends Comparable<? super E>>

   // Parameters
   private static final int DEAFULT_CAPACITY = 10;
   private E[] theItems;
   private int theSize;

   // Constructors
   /**
   * Creates an empty priority queue
   */

   public PrQueue();
   /**
   * Creates a priority queue from an array
   * @param e Array of elements
   */
   public PrQueue(E[] e);

   /**
   * This Method orders the elements of the Array
   * from smallest to biggest
   */
   private void orderPr();
   // Methods
   /**
   * Inserts e in the priority queue
   * @param e the element to insert in the 
   * queue according to its priority value
   */
   public void insert(E e);

   private void ensureCapacity (int capacity);

   /**
   * Obtains the element with the lowest priority value
   * @return the element with he lowest priority
   */
   public E findMin();

   /**
   * Removes the element with the lowest priority value
   * @return the element with the lowest priority value 
   * prior to the deletion
   */
   public E deleteMin();

   /**
   * Removes all the elements of the queue
   */
   public void makeEmpty();

   /**
  * Tells if the queue is empty
  * @return true if this queue is empty, false otherwise
  */
   public boolean isEmpty();


  /**
  * Lowers the value of the item at position p by d amount
  * @param p position of the item
  * @param d amount
  * @return
  */
  public boolean decreaseKey(int p, int d)
  

  

  /**
  * 
  * @param p
  * @param d
  * @return
  */
 public boolean increaseKey(int p, int d)
 

 


 /**
 * Removes the element at pth position
 * @param p position
 * @return deleted element
 */
 public E delete(int p);



那么,关于如何做到这一点的任何想法?我在 google 和 here 上搜索过,但在我目前看到的 binaryheap 实现中,它们不包含这些方法,或者它们返回错误。

【问题讨论】:

你应该考虑使用orderPr()方法。 orderPr() 方法只是组织队列以确保它是有序的,它不会改变任何元素的优先级值。 【参考方案1】:

更改元素的优先级值,然后调用orderPr确保它在数据结构中的正确位置,如果不是,则将其移动到那里。

但是您如何更改元素的优先级值,因为E 没有提供这样做的方法?嗯...显而易见的解决方案是向E 添加一个新方法,您可以通过使其扩展一个新接口(使用新方法setPriority)来实现,该接口扩展Comparable

还有其他可能的解决方案,但不是那么优雅。

【讨论】:

嗯,好的。因此,正如我所想,没有更通用的方法来更改可比较对象 E 的键。谢谢。

以上是关于Binary Heap ADT 的 increaseKey() 方法的主要内容,如果未能解决你的问题,请参考以下文章

ADT - heap(堆)

9.STL简单binary heap的实现

POJ-1785-Binary Search Heap Construction(笛卡尔树)

笛卡尔树 POJ ——1785 Binary Search Heap Construction

二叉堆和堆排序(binary heap)

POJ 1785 Binary Search Heap Construction (线段树)