private Comparable RightChild(Comparable X) { int idx = RightChildIndex(X) - 1; if (idx < ImplicitHeap.Count) { return((Comparable)ImplicitHeap[idx]); } else { return(null); } }
private Comparable Parent(Comparable X) { int idx = ParentIndex(X) - 1; if (idx > -1) { return((Comparable)ImplicitHeap[idx]); } else { return(null); } }
public void Insert(Comparable X) { //for (int i = 0; i < ImplicitHeap.Count; i++) //{ // if (ImplicitHeap[i] == X) // { // BasicConsole.Write(Name); // BasicConsole.Write(" - "); // BasicConsole.WriteLine("Priority queue : Error! Attempted to re-insert item."); // return; // } //} X.Position = ImplicitHeap.Count + 1; ImplicitHeap.Add((FOS_System.Object)X); DecreaseKey(X, X.Key); }
public void DecreaseKey(Comparable X, int NewKey) { if (NewKey > X.Key) { ExceptionMethods.Throw(new Exceptions.ArgumentException("New key is larger than old key!")); } X.Key = NewKey; Comparable parent = Parent(X); while (parent != null && X.Key < parent.Key) { Swap(parent, X); parent = Parent(X); } }
private int RightChildIndex(Comparable X) { return((X.Position * 2) + 1); }
private int LeftChildIndex(Comparable X) { return(X.Position * 2); }
public bool Insert(Comparable X) { //for (int i = 0; i < ImplicitHeap.Count; i++) //{ // if (ImplicitHeap[i] == X) // { // BasicConsole.Write(Name); // BasicConsole.Write(" - "); // BasicConsole.WriteLine("Priority queue : Error! Attempted to re-insert item."); // return false; // } //} X.Position = ImplicitHeap.Count + 1; ImplicitHeap.Add((FOS_System.Object)X); DecreaseKey(X, X.Key); return true; }
private int RightChildIndex(Comparable X) { return (X.Position * 2) + 1; }
private int ParentIndex(Comparable X) { if (X.Position > 1) { return X.Position / 2; } return 0; }
private Comparable RightChild(Comparable X) { int idx = RightChildIndex(X)-1; if (idx < ImplicitHeap.Count) { return (Comparable)ImplicitHeap[idx]; } else { return null; } }
private Comparable Parent(Comparable X) { int idx = ParentIndex(X)-1; if (idx > -1) { return (Comparable)ImplicitHeap[idx]; } else { return null; } }
private void Swap(Comparable X, Comparable Y, bool print = false) { int tempPos = X.Position; X.Position = Y.Position; Y.Position = tempPos; ImplicitHeap[X.Position - 1] = (FOS_System.Object)X; ImplicitHeap[Y.Position - 1] = (FOS_System.Object)Y; }
private void Rebalance(Comparable Y) { //BasicConsole.WriteLine("Rebalance (1)"); Comparable ALeftChild = LeftChild(Y); Comparable ARightChild = RightChild(Y); while ((ALeftChild != null && Y.Key > ALeftChild.Key) || (ARightChild != null && Y.Key > ARightChild.Key)) { //BasicConsole.WriteLine("Rebalance (2)"); if (ALeftChild != null && Y.Key > ALeftChild.Key) { if (ARightChild != null && ARightChild.Key < ALeftChild.Key) { Swap(ARightChild, Y); } else { Swap(ALeftChild, Y); } } else if (ARightChild != null && Y.Key > ARightChild.Key) { Swap(ARightChild, Y); } ALeftChild = LeftChild(Y); ARightChild = RightChild(Y); } }
public void Delete(Comparable X) { //BasicConsole.WriteLine("Deleting"); //bool OK = false; //for (int i = 0; i < ImplicitHeap.Count; i++) //{ // if (ImplicitHeap[i] == X) // { // OK = true; // break; // } //} //if (!OK) //{ // BasicConsole.WriteLine("Deleting when not present."); //} if (X.Position <= 0 || X.Position > ImplicitHeap.Count || ImplicitHeap[X.Position - 1] != X) { //BasicConsole.WriteLine("No delete"); return; } //BasicConsole.WriteLine("Will delete"); if (ImplicitHeap.Count > 1) { //BasicConsole.WriteLine("Using last item"); Comparable Y = (Comparable)ImplicitHeap.Last(); if (X != Y) { //BasicConsole.WriteLine("X not equal to Y"); //BasicConsole.WriteLine("Removing Y"); ImplicitHeap.RemoveAt(Y.Position - 1); //BasicConsole.WriteLine("Setting Y position"); Y.Position = X.Position; //BasicConsole.WriteLine("Setting Y in array"); ImplicitHeap[Y.Position - 1] = (FOS_System.Object)Y; //BasicConsole.WriteLine("Rebalancing"); Rebalance(Y); } else { //BasicConsole.WriteLine("X is Y, removing X"); ImplicitHeap.RemoveAt(X.Position - 1); } } else { //BasicConsole.WriteLine("Removing at index 0"); ImplicitHeap.RemoveAt(0); } //BasicConsole.WriteLine("Reset position"); X.Position = 0; }
public virtual int Compare(Comparable x, Comparable y) { return x.Key < y.Key ? -1 : x.Key == y.Key ? 0 : 1; }
public virtual int Compare(Comparable x, Comparable y) { return(x.Key < y.Key ? -1 : x.Key == y.Key ? 0 : 1); }
private int LeftChildIndex(Comparable X) { return X.Position * 2; }