예제 #1
0
        /// <summary>
        /// Executes one command from the input.
        /// </summary>
        /// <param name="command">Command to be executed.</param>
        private void ExecuteCommand(string command)
        {
            string[] tokens = command.Split(new char[] { ' ' });
            switch (tokens[0])
            {
            // new heap
            case "#":
                if (totalCurNodes > 0)
                {
                    FinishCurrentHeap();
                }
                totalCurNodes = int.Parse(tokens[1]);
                Heap          = new FibonacciHeap <int, int>();
                Nodes         = new Node <int, int> [totalCurNodes];
                Heap.Naive    = naive;
                break;

            // insert
            case "I":
                int id = int.Parse(tokens[1]);
                var n  = new Node <int, int>(id, int.Parse(tokens[2]));
                Heap.Insert(n);
                Nodes[id] = n;
                break;

            // delete minimum
            case "M":
                if (Heap.NodesCount > 0)
                {
                    Nodes[Heap.Minimum.Identifier] = null;
                }
                var min = Heap.DeleteMinimum();
                if (min != null)
                {
                    totalMin++;
                    AverageDeleteMinimumSteps += Heap.LastOperationSteps;
                    if (Heap.LastOperationSteps > MaxDeleteMinimumSteps)
                    {
                        MaxDeleteMinimumSteps = Heap.LastOperationSteps;
                    }
                }
                break;

            // decrease key
            case "D":
                var decreased = Heap.DecreaseKey(int.Parse(tokens[2]), Nodes[int.Parse(tokens[1])]);
                if (decreased)
                {
                    totalDK++;
                    AverageDecreaseKeySteps += Heap.LastOperationSteps;
                    if (Heap.LastOperationSteps > MaxDecreaseKeySteps)
                    {
                        MaxDecreaseKeySteps = Heap.LastOperationSteps;
                    }
                }
                break;
            }
        }
예제 #2
0
        /// <summary>
        /// Auxiliary testing method - randomly executes 1M inserts/deletes/decreases key in a 1K nodes heap.
        /// </summary>
        public static void TestHeap()
        {
            var sequenceLength = 1000000;
            var n           = 1000;
            var maxPriority = 1000;
            var random      = new Random(0);
            var nodes       = new Node <int, int> [n];
            var heap1       = new FibonacciHeap <int, int>();

            for (var i = 0; i < sequenceLength; i++)
            {
                var r = random.Next(5);

                if (r != 1 && r != 2) // Insert
                {
                    var id  = random.Next(n);
                    var key = random.Next(maxPriority);
                    if (nodes[id] != null)
                    {
                        continue;
                    }
                    Node <int, int> node = new Node <int, int>(id, key);
                    heap1.Insert(node);
                    nodes[id] = node;
                }
                else if (r == 1) // Delete min
                {
                    var min1 = heap1.Minimum;
                    if (min1 == null)
                    {
                        continue;
                    }
                    heap1.DeleteMinimum();
                    nodes[min1.Identifier] = null;
                }
                else if (r == 2) // Decrease
                {
                    var id    = random.Next(n);
                    var key   = random.Next(maxPriority);
                    var node1 = nodes[id];
                    heap1.DecreaseKey(key, node1);
                }
            }
        }