Class SimpleFibonacciHeap<E>

java.lang.Object
org.cicirello.ds.SimpleFibonacciHeap<E>
Type Parameters:
E - The type of object contained in the SimpleFibonacciHeap.
All Implemented Interfaces:
Iterable<PriorityQueueNode.Integer<E>>, Collection<PriorityQueueNode.Integer<E>>, Queue<PriorityQueueNode.Integer<E>>, MergeablePriorityQueue<E,SimpleFibonacciHeap<E>>, PriorityQueue<E>, Copyable<SimpleFibonacciHeap<E>>
Direct Known Subclasses:
FibonacciHeap

public class SimpleFibonacciHeap<E> extends Object implements MergeablePriorityQueue<E,SimpleFibonacciHeap<E>>, Copyable<SimpleFibonacciHeap<E>>

An implementation of a Fibonacci Heap. An instance of a SimpleFibonacciHeap contains (element, priority) pairs, such that the priority values are of type int.

Origin: Fibonacci heaps were first introduced in the following article: M. L. Fredman and R. E. Tarjan (1987). Fibonacci Heaps and Their Uses in Improved Network Optimization Algorithms. Journal of the ACM, 34(3): 596-615, July 1987.

Consider using the FibonacciHeap class instead if your application requires any of the following: distinct elements, efficient containment checks, efficient priority increases or decreases, efficient arbitrary element removals. The FibonacciHeap class can find an arbitrary element in constant time, making all of those operations faster.

Priority order: SimpleFibonacciHeap instances are created via factory methods with names beginning with create. The priority order depends upon the factory method used to create the SimpleFibonacciHeap. Methods named createMinHeap produce a min heap with priority order minimum-priority-first-out. Methods named createMaxHeap produce a max heap with priority order maximum-priority-first-out.

Creating instances: To create an instance, use one of the factory methods, such as with:


 SimpleFibonacciHeap<String> pq = SimpleFibonacciHeap.createMinHeap();
 

Method runtimes: The asymptotic runtime of the methods of this class are as follows (where n is the current size of the heap and m is the size of a Collection parameter where relevant). Note that in many cases in this list, the runtimes are amortized time and not actual time (see a reference on Fibonacci heaps for details).

  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    add(E element, int priority)
    Adds an (element, priority) pair to the priority queue with a specified priority.
    boolean
    Adds an (element, priority) pair to the priority queue.
    final boolean
    change(E element, int priority)
    Changes the priority of an element if the element is present in the priority queue, and otherwise adds the (element, priority) pair to the priority queue.
    void
    Clears the priority queue, removing all elements.
    boolean
    Checks if this priority queue contains a given element or an (element, priority) pair with a given element.
    boolean
    Checks if this priority queue contains all elements or (element, priority) pairs from a given Collection.
    Creates an identical copy of this object.
    static <E> SimpleFibonacciHeap<E>
    Creates an empty SimpleFibonacciHeap with maximum-priority-first-out priority order.
    static <E> SimpleFibonacciHeap<E>
    Creates a SimpleFibonacciHeap from a collection of (element, priority) pairs, with a maximum-priority-first-out priority order.
    static <E> SimpleFibonacciHeap<E>
    Creates an empty SimpleFibonacciHeap with minimum-priority-first-out priority order.
    static <E> SimpleFibonacciHeap<E>
    Creates a SimpleFibonacciHeap from a collection of (element, priority) pairs, with a minimum-priority-first-out priority order.
    final boolean
    demote(E element, int priority)
    Demotes an element relative to priority order if the element is present in the priority queue.
    boolean
    equals(Object other)
    Checks if this SimpleFibonacciHeap contains the same (element, priority) pairs as another SimpleFibonacciHeap, including the specific structure the SimpleFibonacciHeap, as well as that the priority order is the same.
    int
    Computes a hashCode.
    final boolean
    Checks if the priority queue is empty.
    Returns an iterator over the (element, priority) pairs in a mostly arbitrary order (i.e., you must not assume any particular order).
    boolean
    Merges another priority queue into this one, adding all of its (element, priority) pairs.
    boolean
    offer(E element, int priority)
    Adds an (element, priority) pair to the priority queue with a specified priority.
    boolean
    Adds an (element, priority) pair to the priority queue.
    Gets the next (element, priority) pair in priority order from this priority queue, without removing it.
    final E
    Gets the next element in priority order from this priority queue, without removing it.
    final int
    Gets the priority of the next element in priority order in the priority queue.
    final int
    peekPriority(E element)
    Gets the priority of a specified element if it is present in the priority queue.
    Removes and returns the next (element, priority) pair in priority order from this priority queue.
    final E
    Removes and returns the next element in priority order from this priority queue.
    final boolean
    promote(E element, int priority)
    Promotes an element relative to priority order if the element is present in the priority queue.
    final boolean
    Removes from this priority queue the (element, priority) pair, if present, for a specified element or element from a specified (element, priority) pair.
    final boolean
    Removes from this priority queue all (element, priority) pairs such that a given Collection c either contains the element or contains an (element, priority) pair with the same element.
    final boolean
    Removes from this priority queue all (element, priority) pairs except for the elements or (element, priority) pairs contained in a given Collection c.
    final int
    Gets the current size of the priority queue, which is the number of (element, value) pairs that it contains.
    final Object[]
    Returns an array containing all of the (element, priority) pairs contained in the priority queue.
    final <T> T[]
    toArray(T[] array)
    Returns an array containing all of the (element, priority) pairs contained in the priority queue.

    Methods inherited from class java.lang.Object

    clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface java.util.Collection

    parallelStream, removeIf, spliterator, stream, toArray

    Methods inherited from interface java.lang.Iterable

    forEach

    Methods inherited from interface org.cicirello.ds.PriorityQueue

    addAll, element, pollThenAdd, pollThenAdd, remove, removeElement
  • Method Details

    • copy

      public SimpleFibonacciHeap<E> copy()
      Description copied from interface: Copyable
      Creates an identical copy of this object.
      Specified by:
      copy in interface Copyable<E>
      Returns:
      an identical copy of this object.
    • createMinHeap

      public static <E> SimpleFibonacciHeap<E> createMinHeap()
      Creates an empty SimpleFibonacciHeap with minimum-priority-first-out priority order.
      Type Parameters:
      E - The type of elements contained in the SimpleFibonacciHeap.
      Returns:
      an empty SimpleFibonacciHeap with a minimum-priority-first-out priority order
    • createMinHeap

      public static <E> SimpleFibonacciHeap<E> createMinHeap(Collection<PriorityQueueNode.Integer<E>> initialElements)
      Creates a SimpleFibonacciHeap from a collection of (element, priority) pairs, with a minimum-priority-first-out priority order.
      Type Parameters:
      E - The type of elements contained in the SimpleFibonacciHeap.
      Parameters:
      initialElements - The initial collection of (element, priority) pairs.
      Returns:
      a SimpleFibonacciHeap with a minimum-priority-first-out priority order
    • createMaxHeap

      public static <E> SimpleFibonacciHeap<E> createMaxHeap()
      Creates an empty SimpleFibonacciHeap with maximum-priority-first-out priority order.
      Type Parameters:
      E - The type of elements contained in the SimpleFibonacciHeap.
      Returns:
      an empty SimpleFibonacciHeap with a maximum-priority-first-out priority order
    • createMaxHeap

      public static <E> SimpleFibonacciHeap<E> createMaxHeap(Collection<PriorityQueueNode.Integer<E>> initialElements)
      Creates a SimpleFibonacciHeap from a collection of (element, priority) pairs, with a maximum-priority-first-out priority order.
      Type Parameters:
      E - The type of elements contained in the SimpleFibonacciHeap.
      Parameters:
      initialElements - The initial collection of (element, priority) pairs.
      Returns:
      a SimpleFibonacciHeap with a maximum-priority-first-out priority order
    • add

      public boolean add(E element, int priority)
      Description copied from interface: PriorityQueue

      Adds an (element, priority) pair to the priority queue with a specified priority.

      This method differs from PriorityQueue.offer(Object, int) in that it throws an exception if the add fails, while the offer method instead returns false, which will occur for the class implementations that require distinct elements. For classes implementing this interface that do not require distinctness, this method should never fail.

      Specified by:
      add in interface PriorityQueue<E>
      Parameters:
      element - The element.
      priority - The priority of the element.
      Returns:
      true if the (element, priority) pair was added.
    • add

      public boolean add(PriorityQueueNode.Integer<E> pair)
      Description copied from interface: PriorityQueue

      Adds an (element, priority) pair to the priority queue.

      This method differs from PriorityQueue.offer(PriorityQueueNode.Integer) in that it throws an exception if the add fails, while the offer method instead returns false, which will occur for the class implementations that require distinct elements. For classes implementing this interface that do not require distinctness, this method should never fail.

      Specified by:
      add in interface Collection<E>
      Specified by:
      add in interface PriorityQueue<E>
      Specified by:
      add in interface Queue<E>
      Parameters:
      pair - The (element, priority) pair to add.
      Returns:
      true if the (element, priority) pair was added.
    • change

      public final boolean change(E element, int priority)
      Description copied from interface: PriorityQueue

      Changes the priority of an element if the element is present in the priority queue, and otherwise adds the (element, priority) pair to the priority queue.

      For those implementations that allow duplicate elements, this method changes the priority of only one element, without defining which is chosen when such duplicates exist.

      Specified by:
      change in interface PriorityQueue<E>
      Parameters:
      element - The element whose priority is to change.
      priority - Its new priority.
      Returns:
      true if and only if the priority queue changed as a consequence of this method call.
    • clear

      public void clear()
      Description copied from interface: PriorityQueue
      Clears the priority queue, removing all elements.
      Specified by:
      clear in interface Collection<E>
      Specified by:
      clear in interface PriorityQueue<E>
    • contains

      public boolean contains(Object o)
      Description copied from interface: PriorityQueue
      Checks if this priority queue contains a given element or an (element, priority) pair with a given element.
      Specified by:
      contains in interface Collection<E>
      Specified by:
      contains in interface PriorityQueue<E>
      Parameters:
      o - An element or (element, priority) pair to check for containment of the element.
      Returns:
      true if and only if this priority queue contains the element.
    • containsAll

      public boolean containsAll(Collection<?> c)
      Checks if this priority queue contains all elements or (element, priority) pairs from a given Collection.

      The runtime of this method is O(n + m) where n is current size of the heap and m is the size of the Collection c. In general this is more efficient than calling contains(Object) repeatedly.

      Specified by:
      containsAll in interface Collection<E>
      Specified by:
      containsAll in interface PriorityQueue<E>
      Parameters:
      c - A Collection of elements or (element, priority) pairs to check for containment.
      Returns:
      true if and only if this priority queue contains all of the elements or (element, priority) pairs in c.
    • demote

      public final boolean demote(E element, int priority)
      Description copied from interface: PriorityQueue

      Demotes an element relative to priority order if the element is present in the priority queue. For a min-heap, demotion means increasing the element's priority, while for a max-heap, demotion means decreasing its priority. If the element is not in the priority queue, or if its new priority is not a demotion, then this method does nothing.

      For those implementations that allow duplicate elements, this method changes the priority of only one element, without defining which is chosen when such duplicates exist.

      Specified by:
      demote in interface PriorityQueue<E>
      Parameters:
      element - The element whose priority is to change.
      priority - Its new priority.
      Returns:
      true if and only if the priority queue changed as a consequence of this method call.
    • equals

      public boolean equals(Object other)
      Checks if this SimpleFibonacciHeap contains the same (element, priority) pairs as another SimpleFibonacciHeap, including the specific structure the SimpleFibonacciHeap, as well as that the priority order is the same.
      Specified by:
      equals in interface Collection<E>
      Overrides:
      equals in class Object
      Parameters:
      other - The other SimpleFibonacciHeap.
      Returns:
      true if and only if this and other contain the same (element, priority) pairs, with the same priority order.
    • hashCode

      public int hashCode()
      Computes a hashCode.
      Specified by:
      hashCode in interface Collection<E>
      Overrides:
      hashCode in class Object
      Returns:
      a hashCode
    • isEmpty

      public final boolean isEmpty()
      Description copied from interface: PriorityQueue
      Checks if the priority queue is empty.
      Specified by:
      isEmpty in interface Collection<E>
      Specified by:
      isEmpty in interface PriorityQueue<E>
      Returns:
      true if and only if it is empty
    • iterator

      public final Iterator<PriorityQueueNode.Integer<E>> iterator()
      Description copied from interface: PriorityQueue
      Returns an iterator over the (element, priority) pairs in a mostly arbitrary order (i.e., you must not assume any particular order).
      Specified by:
      iterator in interface Collection<E>
      Specified by:
      iterator in interface Iterable<E>
      Specified by:
      iterator in interface PriorityQueue<E>
      Returns:
      an iterator over the (element, priority) pairs
    • merge

      public boolean merge(SimpleFibonacciHeap<E> other)

      Merges another priority queue into this one, adding all of its (element, priority) pairs. This is a destructive operation with no guarantees to the state of the other priority queue upon completion. Additionally, some implementations of this method may assume that other and this do not share any elements, and the priority queue may become unstable if they do. The priority order of both priority queues must be the same (e.g., both minheaps or both maxheaps).

      Specified by:
      merge in interface MergeablePriorityQueue<E,SimpleFibonacciHeap<E>>
      Parameters:
      other - The priority queue that you want to merge into this. Implementations need not make any guarantees as to the state of other upon completion.
      Returns:
      true if and only if this priority queue changed as a result of the merge
      Throws:
      IllegalArgumentException - if this and other have different priority-order (e.g., one is a minheap while the other is a maxheap)
    • offer

      public boolean offer(E element, int priority)
      Description copied from interface: PriorityQueue
      Adds an (element, priority) pair to the priority queue with a specified priority.
      Specified by:
      offer in interface PriorityQueue<E>
      Parameters:
      element - The element.
      priority - The priority of the element.
      Returns:
      true if the (element, priority) pair was added, and false otherwise such as for those implementations that enforce distinct elements. For those implementations that allow duplicate elements, this method should always return true.
    • offer

      public boolean offer(PriorityQueueNode.Integer<E> pair)
      Description copied from interface: PriorityQueue
      Adds an (element, priority) pair to the priority queue.
      Specified by:
      offer in interface PriorityQueue<E>
      Specified by:
      offer in interface Queue<E>
      Parameters:
      pair - The (element, priority) pair to add.
      Returns:
      true if the (element, priority) pair was added, and false otherwise such as for those implementations that enforce distinct elements. For those implementations that allow duplicate elements, this method should always return true.
    • peekElement

      public final E peekElement()
      Description copied from interface: PriorityQueue
      Gets the next element in priority order from this priority queue, without removing it.
      Specified by:
      peekElement in interface PriorityQueue<E>
      Returns:
      the next element in priority order, or null if empty.
    • peek

      public final PriorityQueueNode.Integer<E> peek()
      Description copied from interface: PriorityQueue
      Gets the next (element, priority) pair in priority order from this priority queue, without removing it.
      Specified by:
      peek in interface PriorityQueue<E>
      Specified by:
      peek in interface Queue<E>
      Returns:
      the next (element, priority) pair in priority order, or null if empty.
    • peekPriority

      public final int peekPriority()
      Description copied from interface: PriorityQueue
      Gets the priority of the next element in priority order in the priority queue.
      Specified by:
      peekPriority in interface PriorityQueue<E>
      Returns:
      the priority of the next element in priority order.
    • peekPriority

      public final int peekPriority(E element)
      Description copied from interface: PriorityQueue

      Gets the priority of a specified element if it is present in the priority queue. This interface does not define the behavior when the element is not present. Implementations may define the behavior when the element is not present.

      For those implementations that allow duplicate elements, it returns the priority of any one of them, without defining which is chosen.

      Specified by:
      peekPriority in interface PriorityQueue<E>
      Parameters:
      element - The element whose priority is returned.
      Returns:
      the priority of a specified element.
    • pollElement

      public final E pollElement()
      Description copied from interface: PriorityQueue
      Removes and returns the next element in priority order from this priority queue.
      Specified by:
      pollElement in interface PriorityQueue<E>
      Returns:
      the next element in priority order, or null if empty.
    • poll

      public PriorityQueueNode.Integer<E> poll()
      Description copied from interface: PriorityQueue
      Removes and returns the next (element, priority) pair in priority order from this priority queue.
      Specified by:
      poll in interface PriorityQueue<E>
      Specified by:
      poll in interface Queue<E>
      Returns:
      the next (element, priority) pair in priority order, or null if empty.
    • promote

      public final boolean promote(E element, int priority)
      Description copied from interface: PriorityQueue

      Promotes an element relative to priority order if the element is present in the priority queue. For a min-heap, promotion means decreasing the element's priority, while for a max-heap, promotion means increasing its priority. If the element is not in the priority queue, or if its new priority is not a promotion, then this method does nothing.

      For those implementations that allow duplicate elements, this method changes the priority of only one element, without defining which is chosen when such duplicates exist.

      Specified by:
      promote in interface PriorityQueue<E>
      Parameters:
      element - The element whose priority is to change.
      priority - Its new priority.
      Returns:
      true if and only if the priority queue changed as a consequence of this method call.
    • remove

      public final boolean remove(Object o)
      Description copied from interface: PriorityQueue

      Removes from this priority queue the (element, priority) pair, if present, for a specified element or element from a specified (element, priority) pair.

      For those implementations that allow duplicate elements, this method removes only one element, without defining which is chosen when such duplicates exist.

      Specified by:
      remove in interface Collection<E>
      Specified by:
      remove in interface PriorityQueue<E>
      Parameters:
      o - An element or (element, priority) pair, such that element designates the desired pair to remove (note that if you pass an (element, priority) pair, only the element must match to cause removal.
      Returns:
      true if and only if an (element, priority) pair was removed as a result of this method call.
    • removeAll

      public final boolean removeAll(Collection<?> c)
      Removes from this priority queue all (element, priority) pairs such that a given Collection c either contains the element or contains an (element, priority) pair with the same element.

      The runtime of this method is O(n + m) where n is current size of the heap and m is the size of the Collection c. In general this is more efficient than calling remove repeatedly.

      Specified by:
      removeAll in interface Collection<E>
      Specified by:
      removeAll in interface PriorityQueue<E>
      Parameters:
      c - A Collection of elements or (element, priority) pairs for removal.
      Returns:
      true if and only if this priority queue changed as a result of this method.
    • retainAll

      public final boolean retainAll(Collection<?> c)
      Removes from this priority queue all (element, priority) pairs except for the elements or (element, priority) pairs contained in a given Collection c.

      The runtime of this method is O(n + m) where n is current size of the heap and m is the size of the Collection c. In general this is more efficient than calling remove repeatedly.

      Specified by:
      retainAll in interface Collection<E>
      Specified by:
      retainAll in interface PriorityQueue<E>
      Parameters:
      c - A Collection of elements or (element, priority) pairs to keep.
      Returns:
      true if and only if this priority queue changed as a result of this method.
    • size

      public final int size()
      Description copied from interface: PriorityQueue
      Gets the current size of the priority queue, which is the number of (element, value) pairs that it contains.
      Specified by:
      size in interface Collection<E>
      Specified by:
      size in interface PriorityQueue<E>
      Returns:
      the current size of the priority queue.
    • toArray

      public final Object[] toArray()
      Description copied from interface: PriorityQueue
      Returns an array containing all of the (element, priority) pairs contained in the priority queue. The order is not guaranteed. The runtime component type is Object. The priority queue does not maintain any references to the array that is returned, instead creating a new array upon each call to the toArray method. The length of the array that is returned is equal to the current PriorityQueue.size() of the priority queue.
      Specified by:
      toArray in interface Collection<E>
      Specified by:
      toArray in interface PriorityQueue<E>
      Returns:
      an array, whose runtime component type is Object, containing all of the (element, priority) pairs currently in the priority queue.
    • toArray

      public final <T> T[] toArray(T[] array)
      Returns an array containing all of the (element, priority) pairs contained in the priority queue. The order is not guaranteed. The runtime component type is the same as the array passed to it as a parameter. If the specified array is large enough, then it is used, otherwise a new array is allocated whose length is equal to the current PriorityQueue.size() of the priority queue. If the specified array is larger than the current size() of the priority queue, the first extra cell is set to null.
      Specified by:
      toArray in interface Collection<E>
      Specified by:
      toArray in interface PriorityQueue<E>
      Type Parameters:
      T - The component type of the array to contain the (element, priority) pairs
      Parameters:
      array - The array in which to place the (element, priority) pairs, if it is sufficiently large, otherwise a new array of length PriorityQueue.size() is allocated of the same runtime type as array.
      Returns:
      The array in which the (element, priority) pairs have been inserted.
      Throws:
      ArrayStoreException - if the runtime component type of array is not compatible with the type of the (element, priority) pairs.
      NullPointerException - if array is null