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 LeavesValidTreeOnFlatHeapTest()
        {
            var heap = new FibonacciHeap <int, int>();

            heap.Insert(13, 0);
            heap.Insert(26, 0);
            heap.Insert(3, 0);
            heap.Insert(-6, 0);
            heap.Insert(27, 0);
            var node6 = heap.Insert(88, 0);

            heap.Insert(59, 0);
            heap.Insert(-10, 0);
            heap.Insert(16, 0);
            heap.DecreaseKey(node6, -8);
            Assert.Equal(heap.ExtractMinimum().Key, -10);
            Assert.Equal(heap.ExtractMinimum().Key, -8);
            Assert.Equal(heap.ExtractMinimum().Key, -6);
            Assert.Equal(heap.ExtractMinimum().Key, 3);
            Assert.Equal(heap.ExtractMinimum().Key, 13);
            Assert.Equal(heap.ExtractMinimum().Key, 16);
            Assert.Equal(heap.ExtractMinimum().Key, 26);
            Assert.Equal(heap.ExtractMinimum().Key, 27);
            Assert.Equal(heap.ExtractMinimum().Key, 59);
        }
Ejemplo n.º 3
0
        public void Consolidate8NodesIntoWellFormedOrder2TreeTest()
        {
            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);

            // Extracting minimum should trigger consolidate.
            //
            //                       1
            //                      /|
            //  0--1--2--3--4  ->  3 2
            //                     |
            //                     4
            //
            Assert.Equal(heap.ExtractMinimum(), node0);
            Assert.Equal(heap.Size, 4);
            Assert.True(node1.Parent == null);
            Assert.True(node2.Parent == node1);
            Assert.True(node3.Parent == node1);
            Assert.True(node4.Parent == node3);
            Assert.True(node1.Next == node1);
            Assert.True(node2.Next == node3);
            Assert.True(node3.Next == node2);
            Assert.True(node4.Next == node4);
            Assert.True(node1.Child == node2);
            Assert.True(node2.Child == null);
            Assert.True(node3.Child == node4);
            Assert.True(node4.Child == null);
        }
        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 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 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);
        }
Ejemplo n.º 7
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 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 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);
        }