/// <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; } }
/// <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); } } }