public void CutNodeFromTreeIfNotMinimumAndNoGrandparentTest() { var heap = new FibonacciHeap <int, int>(); var node1 = heap.Insert(1, 0); var node2 = heap.Insert(2, 0); var node3 = heap.Insert(3, 0); var node4 = heap.Insert(4, 0); // Extract the minimum, forcing the construction of an order 2 tree which // is changed to an order 0 and order 1 tree after the minimum is extracted. // // 1 // /| 3--2 // 1--2--3--4 -> 3 2 -> | // | 4 // 4 // Assert.Equal(heap.ExtractMinimum(), node1); // Deleting the node should trigger a cut and cascadingCut on the heap. heap.Delete(node4); Assert.Equal(heap.Size, 2); Assert.Equal(heap.ExtractMinimum(), node2); Assert.Equal(heap.ExtractMinimum(), node3); Assert.True(heap.IsEmpty); }
public void LeavesValidTreeOnConsolidatedHeapTest() { var heap = new FibonacciHeap <int, int>(); var node0 = (FibonacciHeap <int, int> .Node)heap.Insert(0, 0); var node1 = (FibonacciHeap <int, int> .Node)heap.Insert(1, 0); var node2 = (FibonacciHeap <int, int> .Node)heap.Insert(2, 0); var node3 = (FibonacciHeap <int, int> .Node)heap.Insert(3, 0); var node4 = (FibonacciHeap <int, int> .Node)heap.Insert(4, 0); var node5 = (FibonacciHeap <int, int> .Node)heap.Insert(5, 0); var node6 = (FibonacciHeap <int, int> .Node)heap.Insert(6, 0); var node7 = (FibonacciHeap <int, int> .Node)heap.Insert(7, 0); var node8 = (FibonacciHeap <int, int> .Node)heap.Insert(8, 0); // Extracting minimum should trigger consolidate. // // __1 // / /| // 5 3 2 // 0--1--2--3--4--5--6--7--8 -> /| | // 7 6 4 // | // 8 // Assert.Equal(heap.ExtractMinimum(), node0); // Decrease node 8 to 0 // // __1 // / /| __1--0 // 5 3 2 / /| // /| | -> 5 3 2 // 7 6 4 /| | // | 7 6 4 // 8 // heap.DecreaseKey(node8, 0); Assert.True(node1.Next == node8); Assert.Equal(heap.Size, 8); Assert.True(heap.ExtractMinimum() == node8); Assert.True(heap.ExtractMinimum() == node1); Assert.True(heap.ExtractMinimum() == node2); Assert.True(heap.ExtractMinimum() == node3); Assert.True(heap.ExtractMinimum() == node4); Assert.True(heap.ExtractMinimum() == node5); Assert.True(heap.ExtractMinimum() == node6); Assert.True(heap.ExtractMinimum() == node7); Assert.True(heap.IsEmpty); }
public void Consolidate8NodesIntoWellFormedOrder3TreeTest() { var heap = new FibonacciHeap <int, int>(); var node0 = (FibonacciHeap <int, int> .Node)heap.Insert(0, 0); var node1 = (FibonacciHeap <int, int> .Node)heap.Insert(1, 0); var node2 = (FibonacciHeap <int, int> .Node)heap.Insert(2, 0); var node3 = (FibonacciHeap <int, int> .Node)heap.Insert(3, 0); var node4 = (FibonacciHeap <int, int> .Node)heap.Insert(4, 0); var node5 = (FibonacciHeap <int, int> .Node)heap.Insert(5, 0); var node6 = (FibonacciHeap <int, int> .Node)heap.Insert(6, 0); var node7 = (FibonacciHeap <int, int> .Node)heap.Insert(7, 0); var node8 = (FibonacciHeap <int, int> .Node)heap.Insert(8, 0); // Extracting minimum should trigger consolidate. // // __1 // / /| // 5 3 2 // 1--2--3--4--5--6--7--8 -> /| | // 7 6 4 // | // 8 // Assert.Equal(heap.ExtractMinimum(), node0); Assert.True(node1.Parent == null); Assert.True(node2.Parent == node1); Assert.True(node3.Parent == node1); Assert.True(node4.Parent == node3); Assert.True(node5.Parent == node1); Assert.True(node6.Parent == node5); Assert.True(node7.Parent == node5); Assert.True(node8.Parent == node7); Assert.True(node1.Next == node1); Assert.True(node2.Next == node5); Assert.True(node3.Next == node2); Assert.True(node4.Next == node4); Assert.True(node5.Next == node3); Assert.True(node6.Next == node7); Assert.True(node7.Next == node6); Assert.True(node8.Next == node8); Assert.True(node1.Child == node2); Assert.True(node2.Child == null); Assert.True(node3.Child == node4); Assert.True(node4.Child == null); Assert.True(node5.Child == node6); Assert.True(node6.Child == null); Assert.True(node7.Child == node8); Assert.True(node8.Child == null); }
public void CutNodeFromTreeIfNotMinimumAndHasGrandparentTest() { var heap = new FibonacciHeap <int, int>(); var node0 = heap.Insert(0, 0); var node1 = heap.Insert(1, 0); var node2 = heap.Insert(2, 0); var node3 = heap.Insert(3, 0); var node4 = heap.Insert(4, 0); var node5 = heap.Insert(5, 0); var node6 = heap.Insert(6, 0); var node7 = heap.Insert(7, 0); var node8 = heap.Insert(8, 0); // extractMinimum on 0 should trigger a cut and cascadingCut on the heap. // // __1 // / /| // 5 3 2 // 0--1--2--3--4--5--6--7--8 -> /| | // 7 6 4 // | // 8 // Assert.Equal(heap.ExtractMinimum(), node0); // Delete node 8 // // __1 // / /| __1 // 5 3 2 / /| // /| | -> 5 3 2 // 7 6 4 /| | // | 7 6 4 // 8 // heap.Delete(node8); Assert.Equal(heap.Size, 7); Assert.Equal(heap.ExtractMinimum(), node1); Assert.Equal(heap.ExtractMinimum(), node2); Assert.Equal(heap.ExtractMinimum(), node3); Assert.Equal(heap.ExtractMinimum(), node4); Assert.Equal(heap.ExtractMinimum(), node5); Assert.Equal(heap.ExtractMinimum(), node6); Assert.Equal(heap.ExtractMinimum(), node7); Assert.True(heap.IsEmpty); }
public void DeleteNoesInFlatHeapTest() { var heap = new FibonacciHeap <int, int>(); var node3 = heap.Insert(13, 0); var node4 = heap.Insert(26, 0); var node2 = heap.Insert(3, 0); var node1 = heap.Insert(-6, 0); var node5 = heap.Insert(27, 0); Assert.Equal(heap.Size, 5); heap.Delete(node3); Assert.Equal(heap.Size, 4); Assert.Equal(heap.ExtractMinimum(), node1); Assert.Equal(heap.ExtractMinimum(), node2); Assert.Equal(heap.ExtractMinimum(), node4); Assert.Equal(heap.ExtractMinimum(), node5); Assert.True(heap.IsEmpty); }
public void CorrectlyAssignIndirectChildWhenDirectChildIsCutFromParentTest() { var heap = new FibonacciHeap <int, int>(); var node0 = (FibonacciHeap <int, int> .Node)heap.Insert(0, 0); heap.Insert(1, 0); heap.Insert(2, 0); heap.Insert(3, 0); heap.Insert(4, 0); var node5 = (FibonacciHeap <int, int> .Node)heap.Insert(5, 0); var node6 = (FibonacciHeap <int, int> .Node)heap.Insert(6, 0); var node7 = (FibonacciHeap <int, int> .Node)heap.Insert(7, 0); heap.Insert(8, 0); // Extracting minimum should trigger consolidate. // // __1 // / /| // 5 3 2 // 0--1--2--3--4--5--6--7--8 -> /| | // 7 6 4 // | // 8 // Assert.Equal(heap.ExtractMinimum(), node0); // Delete node 6, marking 5 // // __1 __1 // / /| / /| // 5 3 2 >5 3 2 // /| | -> / | // 7 6 4 7 4 // | | // 8 8 // heap.Delete(node6); Assert.True(node5.Child == node7); }
public void Consolidate8NodesIntoWellFormedOrder1TreeTest() { var heap = new FibonacciHeap <int, int>(); var node0 = (FibonacciHeap <int, int> .Node)heap.Insert(0, 0); var node1 = (FibonacciHeap <int, int> .Node)heap.Insert(1, 0); var node2 = (FibonacciHeap <int, int> .Node)heap.Insert(2, 0); // Extracting minimum should trigger consolidate. // // 1 // 0--1--2 -> | // 2 // Assert.Equal(heap.ExtractMinimum(), node0); Assert.Equal(heap.Size, 2); Assert.True(node1.Parent == null); Assert.True(node2.Parent == node1); Assert.True(node1.Next == node1); Assert.True(node2.Next == node2); Assert.True(node1.Child == node2); Assert.True(node2.Child == null); }
/// <summary> /// Joins another heap to this heap. /// </summary> /// <param name="other">The other heap.</param> public void Union(FibonacciHeap <TKey, TValue> other) { _minNode = MergeLists(_minNode, other._minNode); Size += other.Size; }
public void CutNodeFromTreeIfNotMinimumAndHasGrandparentWithMarkedParentTest() { var heap = new FibonacciHeap <int, int>(); var node0 = (FibonacciHeap <int, int> .Node)heap.Insert(0, 0); var node1 = (FibonacciHeap <int, int> .Node)heap.Insert(1, 0); var node2 = (FibonacciHeap <int, int> .Node)heap.Insert(2, 0); var node3 = (FibonacciHeap <int, int> .Node)heap.Insert(3, 0); var node4 = (FibonacciHeap <int, int> .Node)heap.Insert(4, 0); var node5 = (FibonacciHeap <int, int> .Node)heap.Insert(5, 0); var node6 = (FibonacciHeap <int, int> .Node)heap.Insert(6, 0); var node7 = (FibonacciHeap <int, int> .Node)heap.Insert(7, 0); var node8 = (FibonacciHeap <int, int> .Node)heap.Insert(8, 0); // Extracting minimum should trigger consolidate. // // __1 // / /| // 5 3 2 // 0--1--2--3--4--5--6--7--8 -> /| | // 7 6 4 // | // 8 // Assert.Equal(heap.ExtractMinimum(), node0); // Delete node 6, marking 5 // // __1 __1 // / /| / /| // 5 3 2 >5 3 2 // /| | -> / | // 7 6 4 7 4 // | | // 8 8 // heap.Delete(node6); Assert.True(node5.IsMarked); // Delete node 7, cutting the sub-tree // // __1 // / /| 1--5 // >5 3 2 /| | // / | -> 3 2 8 // 7 4 | // | 4 // 8 // heap.Delete(node7); Assert.True(node5.Next == node1); Assert.True(node2.Next == node3); Assert.True(node3.Next == node2); Assert.Equal(heap.Size, 6); Assert.True(heap.ExtractMinimum() == node1); Assert.True(heap.ExtractMinimum() == node2); Assert.True(heap.ExtractMinimum() == node3); Assert.True(heap.ExtractMinimum() == node4); Assert.True(heap.ExtractMinimum() == node5); Assert.True(heap.ExtractMinimum() == node8); Assert.True(heap.IsEmpty); }