Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        /// <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));
                }
            }
        }
Exemplo n.º 3
0
        /// <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);
        }