public static void RunTestcase() { var queries = 3; const int MAX = 100000 + 1; var queueByPriority = new Queue <string> [MAX]; // int highestPriority = -1; for (int i = 0; i < MAX; i++) { queueByPriority[i] = new Queue <string>(); } var messages = new string[] { "store email1 1", "store email2 10", "get_next_email" }; IList <string> result = new List <string>(); var minHeap = new MinHeap <int>(); for (int i = 0; i < queries; i++) { var command = messages[i].Split(' '); if (command.Length == 1) { // get next email result.Add(RemoveFirstEmail(queueByPriority, MAX, minHeap)); } else { var message = command[1]; var priority = command[2]; SaveMessageToQueue(queueByPriority, message, priority, minHeap); } } }
/// <summary> /// save - O(1), easy to find the queue, which queue to save - by priority number /// </summary> /// <param name="queueByPriority"></param> /// <param name="message"></param> /// <param name="priority"></param> public static void SaveMessageToQueue(Queue <string>[] queueByPriority, string message, string priority, MinHeap <int> minHeap) { int index = Convert.ToInt32(priority); queueByPriority[index].Enqueue(message); if (minHeap.Count == 0) { minHeap.Insert(getNegative(index)); } else { if (queueByPriority[index].Count == 1) { minHeap.Insert(getNegative(index)); } } }
/// <summary> /// size is 100000 - need to do time complexity analysis /// it is O(n) algorithm to remove, not efficient /// </summary> /// <param name="queueByPriority"></param> /// <param name="size"></param> /// <returns></returns> public static string RemoveFirstEmail(Queue <string>[] queueByPriority, int size, MinHeap <int> minHeap) { var message = "-1"; if (minHeap.Count == 0) { return(message); } var highestPriority = getHighestPriority(minHeap.Peek()); Queue <string> current = queueByPriority[highestPriority]; message = current.Dequeue(); if (current.Count == 0) { minHeap.ExtractMin(); } return(message); }