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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }