public void TestPriorityQueue()
        {
            int operationsCount = 100000;

            Random rand = new Random(0);

            PriorityQueue<double> queue = new PriorityQueue<double>();

            for (int op = 0; op < operationsCount; ++op)
            {
                int opType = rand.Next(0, 2);

                if (opType == 0) // Enqueue
                {
                    double item = (100.0 - 1.0) * rand.NextDouble() + 1.0;
                    queue.Enqueue(item);

                    Assert.IsTrue(queue.IsConsistent(), "Test fails after enqueue operation # " + op);
                }
                else // Dequeue
                {
                    if (queue.Count > 0)
                    {
                        double item = queue.Dequeue();
                        Assert.IsTrue(queue.IsConsistent(), "Test fails after dequeue operation # " + op);
                    }
                }
            }
        }
Exemple #2
0
        static void Main()
        {
            PriorityQueue<int> queue = new PriorityQueue<int>();
            queue.Enqueue(10);
            queue.Enqueue(3);
            queue.Enqueue(14);
            queue.Enqueue(12);
            queue.Enqueue(5);
            queue.Enqueue(2);

            Console.WriteLine("Printing the queue");
            foreach (var item in queue)
            {
                Console.WriteLine(item);
            }

            Console.WriteLine("Dequeue {0}", queue.Dequeue());
            Console.WriteLine("Dequeue {0}", queue.Dequeue());

            Console.WriteLine("Printing the queue again");
            foreach (var item in queue)
            {
                Console.WriteLine(item);
            }
        }
        public void Enqueue_InsertLowMediumMediumHighPriorityElements_GetElementsBackInOrder()
        {
            IQueue queue = new PriorityQueue(MaxCapacity);

            queue.Enqueue(VALID_ELEMENT_CAM_ON, QueuePriorities.Low);
            queue.Enqueue(VALID_ELEMENT_MOVEMENT, QueuePriorities.Medium);
            queue.Enqueue(VALID_ELEMENT_CAM_ON, QueuePriorities.Medium);
            queue.Enqueue(VALID_ELEMENT_MOVEMENT, QueuePriorities.High);

            string expected1 = VALID_ELEMENT_MOVEMENT;
            string expected2 = VALID_ELEMENT_CAM_ON;
            string expected3 = VALID_ELEMENT_MOVEMENT;
            string expected4 = VALID_ELEMENT_CAM_ON;

            string actual1;
            string actual2;
            string actual3;
            string actual4;

            bool result1 = queue.TryDequeue(out actual1);
            bool result2 = queue.TryDequeue(out actual2);
            bool result3 = queue.TryDequeue(out actual3);
            bool result4 = queue.TryDequeue(out actual4);

            Assert.AreEqual(expected1, actual1);
            Assert.AreEqual(expected2, actual2);
            Assert.AreEqual(expected3, actual3);
            Assert.AreEqual(expected4, actual4);
        }
 private static void PrintNumbersOnConsole(PriorityQueue<int> numbers)
 {
     foreach (int number in numbers)
     {
         Console.WriteLine(number);
     }
 }
Exemple #5
0
    /* 1 Implement a class PriorityQueue<T> based
     * on the data structure "binary heap".
     * */
    static void Main(string[] args)
    {
        var heap = new Heap<int>();
        heap.Add(1);
        heap.Add(2);
        heap.Add(3);

        Debug.Assert(heap.SameContents(new[] { 1, 2, 3 }));
        Console.WriteLine(string.Join(",", heap));

        Debug.Assert(heap.ChopHead() == 3);
        Debug.Assert(heap.ChopHead() == 2);
        Debug.Assert(heap.ChopHead() == 1);
        Debug.Assert(heap.IsEmpty);

        // higher string means lower priority
        var pqueue = new PriorityQueue<string, string>((s1, s2) => -s1.CompareTo(s2));

        pqueue.Enqueue("18:00", "Buy food");
        pqueue.Enqueue("06:00", "Walk dog");
        pqueue.Enqueue("21:00", "Do homework");
        pqueue.Enqueue("09:00", "Go to work");
        pqueue.Enqueue("21:00", "Drink beer");

        Debug.Assert(pqueue.Count == 5);

        Debug.Assert(pqueue.Dequeue() == "Walk dog");
        Debug.Assert(pqueue.Dequeue() == "Go to work");
        Debug.Assert(pqueue.Dequeue() == "Buy food");
        Debug.Assert(new[] { "Do homework", "Drink beer" }.Contains(pqueue.Dequeue()));
        Debug.Assert(new[] { "Do homework", "Drink beer" }.Contains(pqueue.Dequeue()));
    }
Exemple #6
0
    public static void FindMinimalDistance(Dictionary<Node, List<Connection>> graph, Node source)
    {
        var queue = new PriorityQueue<Node>();

        foreach (var node in graph)
            node.Key.DijkstraDistance = long.MaxValue; // double.PositiveInfinity;

        queue.AddFirst(source);
        source.DijkstraDistance = 0;

        while (queue.Count != 0)
        {
            var currentNode = queue.RemoveFirst();

            // if (currentNode.DijkstraDistance == long.MaxValue) break;

            foreach (var neighbour in graph[currentNode])
            {
                var potDistance = neighbour.Distance + currentNode.DijkstraDistance;

                if (potDistance < neighbour.ToNode.DijkstraDistance)
                {
                    neighbour.ToNode.DijkstraDistance = potDistance;
                    queue.AddFirst(neighbour.ToNode);
                }
            }
        }
    }
        public void CorrectPriorityTest1()
        {
            PriorityQueue<int> queue = new PriorityQueue<int>();

            queue.Enqueue(-12);
            queue.Enqueue(512);
            queue.Enqueue(77);
            queue.Enqueue(-1);
            queue.Enqueue(82);
            queue.Enqueue(92);
            queue.Enqueue(-111);
            queue.Enqueue(-151);
            queue.Enqueue(512);
            queue.Enqueue(55);

            Assert.AreEqual(10, queue.Count);
            Assert.AreEqual(512, queue.Dequeue());
            Assert.AreEqual(512, queue.Dequeue());
            Assert.AreEqual(92, queue.Dequeue());
            Assert.AreEqual(82, queue.Dequeue());
            Assert.AreEqual(77, queue.Dequeue());
            Assert.AreEqual(55, queue.Dequeue());
            Assert.AreEqual(-1, queue.Dequeue());
            Assert.AreEqual(-12, queue.Dequeue());
            Assert.AreEqual(-111, queue.Dequeue());
            Assert.AreEqual(-151, queue.Dequeue());
        }
        public void EnqueueAndDequeueReverseOrder()
        {
            PriorityQueue queue = new PriorityQueue();
            Assert.False(queue.IsDataAvailable);
            queue.Enqueue(new PriorityQueueEntry(Priority.Pri7));
            queue.Enqueue(new PriorityQueueEntry(Priority.Pri4));
            queue.Enqueue(new PriorityQueueEntry(Priority.Pri3));
            Assert.True(queue.IsDataAvailable);

            PriorityQueueEntry output;
            Assert.True(queue.TryDequeue(out output));
            Assert.NotNull(output);
            Assert.Equal(Priority.Pri3, output.Priority);
            Assert.True(queue.IsDataAvailable);

            Assert.True(queue.TryDequeue(out output));
            Assert.NotNull(output);
            Assert.Equal(Priority.Pri4, output.Priority);
            Assert.True(queue.IsDataAvailable);

            Assert.True(queue.TryDequeue(out output));
            Assert.NotNull(output);
            Assert.Equal(Priority.Pri7, output.Priority);

            Assert.False(queue.IsDataAvailable);
        }
Exemple #9
0
    public static Path<Tile> FindPath(
        Tile start,
        Tile destination)
    {
        var closed = new HashSet<Tile>();
        var queue = new PriorityQueue<double, Path<Tile>>();
        queue.Enqueue(0, new Path<Tile>(start));

        while (!queue.IsEmpty)
        {
            var path = queue.Dequeue();

            if (closed.Contains(path.LastStep))
                continue;
            if (path.LastStep.Equals(destination))
                return path;

            closed.Add(path.LastStep);

            foreach (Tile n in path.LastStep.Neighbours)
            {
                double d = distance(path.LastStep, n);
                var newPath = path.AddStep(n, d);
                queue.Enqueue(newPath.TotalCost + estimate(n, destination), 
                    newPath);
            }
        }

        return null;
    }
    static void Main()
    {
        Console.WriteLine("Creating an instance of the custom PriorityQueue class and adding 8 integers to it in non-increasing randomized order.");
        var priorityQueue = new PriorityQueue<int>();
        priorityQueue.Enqueue(5);
        priorityQueue.Enqueue(3);
        priorityQueue.Enqueue(2);
        priorityQueue.Enqueue(5);
        priorityQueue.Enqueue(15);
        priorityQueue.Enqueue(6);
        priorityQueue.Enqueue(0);
        priorityQueue.Enqueue(-8);

        Console.WriteLine("Printing the queue:");
        PrintQueue(priorityQueue);

        Console.WriteLine("Dequeuing and displaying the first 5 elements");
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("Dequeuing the number {0}", priorityQueue.Dequeue());
        }

        Console.WriteLine("Printing the queue after the removal:");
        PrintQueue(priorityQueue);

        Console.WriteLine("Adding 5 more integers to the queue in non-increasing randomized order.");
        priorityQueue.Enqueue(9);
        priorityQueue.Enqueue(20);
        priorityQueue.Enqueue(13);
        priorityQueue.Enqueue(2);
        priorityQueue.Enqueue(7);

        Console.WriteLine("Printing the queue after the addition:");
        PrintQueue(priorityQueue);
    }
Exemple #11
0
    private static void Main()
    {
        var items = new[] { 2, 6, 3, 2, 1, 7, 4, 9, 5, 1, 8 };
        Console.WriteLine("Items: [{0}]", string.Join(", ", items));


        // Priority queue of integers, where a lower number means higher priority
        var queue = new PriorityQueue<int>();        

        // Add each item to the priority queue and 
        // check if the item with the highest priority is at the top of the queue
        var minItem = int.MaxValue;
        foreach (var item in items)
        {
            queue.Enqueue(item);
            minItem = Math.Min(item, minItem);            
            Debug.Assert(queue.Peek() == minItem);
        }

        // Now check if after each dequeue, the items come out ranked by priority
        var sorted = new List<int>();
        while (queue.Count > 0)
        {
            sorted.Add(queue.Dequeue());
        }

        // Items should be sorted in ascending order
        Console.WriteLine("Queue items: [{0}]", string.Join(", ", sorted));
    }
        static ICollection<Node> PrimAlgorithm(Node startNode)
        {
            var mst = new List<Node>();
            PriorityQueue queue = new PriorityQueue();
            startNode.Used = true;

            mst.Add(startNode);
            foreach (var connection in neighbourhood[startNode])
            {
                queue.Enqueue(connection);
            }

            while (mst.Count != houses.Count)
            {
                var current = queue.Dequeue();

                current.ToNode.Used = true;
                mst.Add(current.ToNode);

                foreach (var connection in neighbourhood[current.ToNode])
                {
                    if (!connection.ToNode.Used)
                    {
                        queue.Enqueue(connection);
                    }
                }
            }

            return mst;
        }
Exemple #13
0
    public static void DijkstraAlgorithm(Graph graph, Node source)
    {
        foreach (var node in graph)
        {
            node.MinDistance = double.PositiveInfinity;
        }

        source.MinDistance = 0;

        var pQueue = new PriorityQueue<Node>();
        pQueue.Enqueue(source);

        while (pQueue.Count != 0)
        {
            Node currentNode = pQueue.Dequeue();

            foreach (var neighbour in graph[currentNode.Id].Neighbors)
            {
                double newDist = currentNode.MinDistance + neighbour.Distance;

                if (newDist < neighbour.Node.MinDistance)
                {
                    neighbour.Node.MinDistance = newDist;
                    pQueue.Enqueue(neighbour.Node);
                }
            }
        }
    }
        public void TestEnqueueDequeue()
        {
            PriorityQueue<int> queue = new PriorityQueue<int>();
            queue.enqueueWithPriority (16,4);
            queue.enqueueWithPriority (14,5);
            queue.enqueueWithPriority (25,3);
            queue.enqueueWithPriority (17,4);

            Assert.AreEqual (queue.dequeue (), 14);
            Assert.AreEqual (queue.dequeue (), 16);
            Assert.AreEqual (queue.dequeue (), 17);
            Assert.AreEqual (queue.dequeue (), 25);

            queue.enqueueWithPriority(11,1);

            Assert.AreEqual (queue.dequeue (), 11);

            try {
                Console.Out.WriteLine("Attempting to dequeue an empty queue.");
                queue.dequeue();
                Console.Error.WriteLine("FAIL: System.InvalidOperationExcepti"+
                             "on was not thrown when dequeing an empty queue");
                Assert.IsTrue(false);
            } catch (System.InvalidOperationException e)
            {
                Console.Out.WriteLine("PASS: System.InvalidOperationException"+
                                            " thrown as expected: "+e.Message);
                Assert.IsTrue(true,"Exception thrown");
            }
        }
        static void Main(string[] args)
        {
            IQueue CommanderDispatcherMessageQueue = new PriorityQueue(30);
            IQueue DispatcherSerialMessageQueue = new PriorityQueue(30);
            //IQueue SerialStatusMessageQueue = new PriorityQueue(30);
               // IQueue StatusCommanderMessageQueue = new PriorityQueue(30);
            //IQueue MicrocontrollerCommanderMessageBox = new PriorityQueue(30);

            Thread dispatcher = new Thread(() => Dispatcher(CommanderDispatcherMessageQueue));
            //Thread serialManager = new Thread(() => SerialManager(DispatcherSerialMessageQueue, MicrocontrollerCommanderMessageBox));
            //Thread statusUpdater = new Thread(() => StatusUpdater(SerialStatusMessageQueue));
            //Thread commandSender = new Thread(() => CommandSender(MicrocontrollerCommanderMessageBox));

            RoverCameraFactory.GetInstance().Initialize(Properties.NetworkSettings.Default.OperatorIPAddress, Properties.NetworkSettings.Default.CameraBasePort);

            dispatcher.Start();
            //serialManager.Start();
            //statusUpdater.Start();
               // commandSender.Start();

            //Start the commands listener
            var commandsListener = new GuardedMessageListener(
                Properties.NetworkSettings.Default.CommandsPort,
                CommanderDispatcherMessageQueue,
                Properties.NetworkSettings.Default.OperatorIPAddress,
                new WatchDog());
            commandsListener.StartListening();
        }
        public static void FindMinimalPaths(Dictionary<Node, List<Street>> graph, Node source)
        {
            PriorityQueue<Node> queue = new PriorityQueue<Node>();

            foreach (var node in graph)
            {
                if (source.ID != node.Key.ID)
                {
                    node.Key.DijkstraDistance = ulong.MaxValue;
                }
            }

            source.DijkstraDistance = 0;
            queue.Enqueue(source);

            while (queue.Count != 0)
            {
                Node currentNode = queue.Dequeue();

                foreach (var neighbour in graph[currentNode])
                {
                    ulong potDistance = currentNode.DijkstraDistance + neighbour.Distance;

                    if (potDistance < neighbour.Node.DijkstraDistance)
                    {
                        neighbour.Node.DijkstraDistance = potDistance;
                        // adds only modified elements in the queue
                        // thus reordering the queue after each iteration is avoided
                        queue.Enqueue(neighbour.Node);
                    }
                }
            }
        }
Exemple #17
0
        static void Main()
        {
            var bag = new PriorityQueue<Car>();

            var opel = new Car
            {
                Model = "Opel",
                Price = 1000
            };
            var mercedes = new Car
            {
                Model = "Mercedes",
                Price = 5000
            };

            var citroen = new Car
            {
                Model = "Citroen",
                Price = 3000
            };

            bag.Enqueue(opel);
            bag.Enqueue(mercedes);
            bag.Enqueue(citroen);

            while(bag.Count > 0)
            {
                var car = bag.Dequeue();
                Console.WriteLine("{0} -> {1}",car.Model, car.Price);
            }
        }
Exemple #18
0
 static void Main(string[] args)
 {
     PriorityQueue queue = new PriorityQueue();
     queue.Enqueue("Name1", Priority.Low);
     queue.Enqueue("Name2", Priority.Low);
     queue.Enqueue("Name3", Priority.Low);
     queue.Enqueue("Name4", Priority.Low);
     queue.Enqueue("Name5", Priority.Low);
     queue.Enqueue("Name6", Priority.Low);
     queue.Enqueue("Name7", Priority.Low);
     queue.Enqueue("Name8", Priority.Low);
     queue.Enqueue("Name9", Priority.Low);
     Console.WriteLine("There are " + queue.Length + " people in line.");
     Console.WriteLine("Person in front: " + queue.PeekAtFrontName() + " with priority " + queue.PeekAtFrontPriority());
     queue.Dequeue();
     Console.WriteLine("Person in front: " + queue.PeekAtFrontName() + " with priority " + queue.PeekAtFrontPriority());
     queue.Dequeue();
     Console.WriteLine("Person in front: " + queue.PeekAtFrontName() + " with priority " + queue.PeekAtFrontPriority());
     queue.Enqueue("Name10", Priority.Medium);
     Console.WriteLine("Person in front: " + queue.PeekAtFrontName() + " with priority " + queue.PeekAtFrontPriority());
     queue.Enqueue("Name11", Priority.Medium);
     Console.WriteLine("Person in front: " + queue.PeekAtFrontName() + " with priority " + queue.PeekAtFrontPriority());
     queue.Dequeue();
     queue.Enqueue("Dad", Priority.High);
     Console.WriteLine("Person in front: " + queue.PeekAtFrontName() + " with priority " + queue.PeekAtFrontPriority());
 }
        public void CorrectPriorityTest2()
        {
            PriorityQueue<int> queue = new PriorityQueue<int>();

            queue.Enqueue(4);
            queue.Enqueue(1);
            queue.Enqueue(3);
            queue.Enqueue(2);
            queue.Enqueue(16);
            queue.Enqueue(9);
            queue.Enqueue(10);
            queue.Enqueue(14);
            queue.Enqueue(8);
            queue.Enqueue(7);

            Assert.AreEqual(10, queue.Count);
            Assert.AreEqual(16, queue.Dequeue());
            Assert.AreEqual(14, queue.Dequeue());
            Assert.AreEqual(10, queue.Dequeue());
            Assert.AreEqual(9, queue.Dequeue());
            Assert.AreEqual(8, queue.Dequeue());
            Assert.AreEqual(7, queue.Dequeue());
            Assert.AreEqual(4, queue.Dequeue());
            Assert.AreEqual(3, queue.Dequeue());
            Assert.AreEqual(2, queue.Dequeue());
            Assert.AreEqual(1, queue.Dequeue());
        }
    //-------------------------------------Movement-----------------------------------------//
    // A* algorithm to find shortest path to desired tile.
    private Path<Tile> findShortestPath(Tile start, Tile end)
    {
        PriorityQueue<int, Path<Tile>> open = new PriorityQueue<int, Path<Tile>>();
        HashSet<Tile> closed = new HashSet<Tile>();
        open.Enqueue(0, new Path<Tile>(start));
        int cost = 1;

        while (!open.isEmpty())
        {
            var path = open.Dequeue();
            if (closed.Contains(path.LastStep))
            {
                continue;
            }
            if (path.LastStep.Equals(end))
            {
                return path;
            }
            closed.Add(path.LastStep);
            foreach (Tile t in path.LastStep.connectedTiles)
            {
                if (t.isBlocked)
                {
                    closed.Add(t);
                    continue;
                }

                var newPath = path.AddStep(t, cost);
                open.Enqueue(newPath.TotalCost, newPath);
            }
        }
        return null;
    }
Exemple #21
0
        public Route GetShortestPath(Vertex from, Vertex to)
        {
            ResetExploration();

            var queue = new PriorityQueue<double, Route>();

            queue.Enqueue(0, new Route { @from });
            while (!queue.IsEmpty)
            {
                var route = queue.Dequeue();
                if (route.Last().IsExplored)
                    continue;

                if (route.Last().Equals(to))
                    return route;

                route.Last().IsExplored = true;
                foreach (Edge n in route.Last().AdjacentEdges)
                {
                    var newRoute = route.Clone();
                    newRoute.Add(n.Tail);
                    queue.Enqueue(newRoute.Cost, newRoute);
                }
            }
            return null;
        }
Exemple #22
0
        public void SimpleWithPriority()
        {
            var priorityQueue = new PriorityQueue<string, int>(PriorityQueueType.Minimum);

            int priority;

            priorityQueue.Enqueue("g", 6);

            var item = priorityQueue.Peek(out priority);

            Assert.AreEqual(item, "g");
            Assert.AreEqual(priority, 6);
            Assert.AreEqual(priorityQueue.Count, 1);

            priorityQueue.Enqueue("h", 5);

            item = priorityQueue.Peek(out priority);

            Assert.AreEqual(item, "h");
            Assert.AreEqual(priority, 5);
            Assert.AreEqual(priorityQueue.Count, 2);

            priorityQueue.Enqueue("i", 7);

            item = priorityQueue.Peek(out priority);

            Assert.AreEqual(item, "h");
            Assert.AreEqual(priority, 5);
            Assert.AreEqual(priorityQueue.Count, 3);
        }
Exemple #23
0
    public PriorityQueue<IHearable> getObjectsObservableBy(IHearing listener)
    {
        //Brute force approach = O(n)
        //For all hearing objects it's O(m*n) ~ Acceptable.
        PriorityQueue<IHearable> queue = new PriorityQueue<IHearable>(true);
        int i;

        IHearable target;
        for (i=0;i<hearableObjects.Count;++i)
        {
            double distanceSquared,priority; //Hopefully this will be optimized out.

            target = hearableObjects[i];

            //Calculates Distance^2
            distanceSquared = (listener.getLocation() - target.getLocation()).sqrMagnitude;

            //Store in variable for use as queue priority
            priority = target.getVolume().volumeFromDistanceSquared(distanceSquared).Intensity;

            //Put in queue if louder than hearing threshold.
            //Debug.Log(Volume.fromIntensity(priority).Decibels + " " + target.getGameObject().name);
            if (priority >= listener.getHearingThreshold().Intensity)
            {
                //Debug.Log(Volume.fromIntensity(priority).Decibels + " " + target.getGameObject().name);
                queue.enqueueWithPriority(target,priority);
            }
        }

        return queue;
    }
Exemple #24
0
 /// <summary>Returns a synchronized wrapper around the queue.</summary>
 /// <param name="queue">The queue to be synchronized.</param>
 /// <returns>A synchronized priority queue.</returns>
 public static PriorityQueue Synchronize(PriorityQueue queue)
 {
     // Return the queue if it is already synchronized.  Otherwise, wrap it
     // with a synchronized wrapper.
     if (queue is SyncPriorityQueue) return queue;
     return new SyncPriorityQueue(queue);
 }
Exemple #25
0
        public void PriorityQueue_Dequeue_NonRepeatedValues_Success()
        {
            // Arrange
            var priorityQueue = new PriorityQueue<int>();
            var values = new int[] { 10, 7, 6, 1, 2, 3, 5, 4, 9, 8 };
            var expected = "1,2,3,4,5,6,7,8,9,10";

            // Act
            foreach (var value in values)
            {
                priorityQueue.Enqueue(value);
            }

            var result = "";
            var index = 0;
            var lastIndex = priorityQueue.Count() - 1;

            while (!priorityQueue.IsEmpty())
            {
                var element = priorityQueue.Dequeue();

                result += index++ == lastIndex ?
                    string.Format("{0}", element.ToString()) : string.Format("{0},", element.ToString());
            }

            // Assert
            Assert.AreEqual(result, expected);
        }
 public void RandomTest()
 {
     PriorityQueue<int> TestObject = new PriorityQueue<int>();
     Utilities.Random.Random Rand = new Utilities.Random.Random();
     int Value=0;
     for (int x = 0; x < 10; ++x)
     {
         Value=Rand.Next();
         TestObject.Add(x, Value);
         Assert.Equal(Value, TestObject.Peek());
     }
     int HighestValue = TestObject.Peek();
     for (int x = 9; x >= 0; --x)
     {
         Value = Rand.Next();
         TestObject.Add(x, Value);
         Assert.Equal(HighestValue, TestObject.Peek());
     }
     int Count=0;
     foreach(int Priority in TestObject.Keys)
     {
         foreach(int Item in TestObject[Priority])
         {
             ++Count;
         }
     }
     Assert.Equal(20, Count);
 }
Exemple #27
0
        public void WithPriority()
        {
            var priorityQueue = new PriorityQueue<string, int>(PriorityQueueType.Maximum);
            priorityQueue.Enqueue("dog", 2);
            priorityQueue.Enqueue("canary", 1);
            priorityQueue.Enqueue("cat", 3);

            int priority;

            // Peek gives us "cat"
            Assert.AreEqual("cat", priorityQueue.Dequeue(out priority));

            // With priority 3
            Assert.AreEqual(priority, 3);

            // Peek gives us "dog"
            Assert.AreEqual("dog", priorityQueue.Dequeue(out priority));

            // With priority 2
            Assert.AreEqual(priority, 2);

            // Peek gives us "canary"
            Assert.AreEqual("canary", priorityQueue.Dequeue(out priority));

            // With priority 1
            Assert.AreEqual(priority, 1);
        }
Exemple #28
0
        public static void Main()
        {
            PriorityQueue<int> priorityQueue = new PriorityQueue<int>(true);

            priorityQueue.Enqueue(100);
            priorityQueue.Enqueue(19);
            priorityQueue.Enqueue(36);
            priorityQueue.Enqueue(17);
            priorityQueue.Enqueue(3);
            priorityQueue.Enqueue(25);
            priorityQueue.Enqueue(1);
            priorityQueue.Enqueue(27);
            priorityQueue.Enqueue(22);
            priorityQueue.Enqueue(100);
            priorityQueue.Enqueue(111);
            priorityQueue.Enqueue(222);
            priorityQueue.Enqueue(100);
            priorityQueue.Enqueue(100);
            priorityQueue.Enqueue(324100);
            priorityQueue.Enqueue(32);
            priorityQueue.Enqueue(4);

            while (priorityQueue.Count > 0)
            {
                Console.WriteLine(priorityQueue.Dequeue());
            }
        }
    // Dijkstra's shortest paths algorithm, implemented
    // with priority queue. Running time: O(M * log M)
    // Learn more at: https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Using_a_priority_queue
    public static void DijkstraAlgorithm(
        Dictionary<Node, List<Edge>> graph, Node sourceNode)
    {
        var queue = new PriorityQueue<Node>();

        foreach (var node in graph)
        {
            node.Key.Distance = double.PositiveInfinity;
        }
        sourceNode.Distance = 0.0d;
        queue.Enqueue(sourceNode);

        while (queue.Count != 0)
        {
            var currentNode = queue.Dequeue();

            if (double.IsPositiveInfinity(currentNode.Distance))
            {
                // All nodes processed --> algorithm finished
                break;
            }

            foreach (var childEdge in graph[currentNode])
            {
                var newDistance = currentNode.Distance + childEdge.Distance;
                if (newDistance < childEdge.Node.Distance)
                {
                    childEdge.Node.Distance = newDistance;
                    childEdge.Node.PreviousNode = currentNode;
                    queue.Enqueue(childEdge.Node);
                }
            }
        }
    }
Exemple #30
0
        public void PriorityQueueGeneralTest()
        {
            var queue = new PriorityQueue<int>();

            Assert.IsTrue(queue.Empty, "New queue should start out empty.");
            Assert.Throws<InvalidOperationException>(() => queue.Peek(), "Peeking at an empty queue should throw.");
            Assert.Throws<InvalidOperationException>(() => queue.Pop(), "Popping an empty queue should throw.");

            foreach (var value in new[] { 4, 3, 5, 1, 2 })
            {
                queue.Add(value);
                Assert.IsFalse(queue.Empty, "Queue should not be empty - items have been added.");
            }

            foreach (var value in new[] { 1, 2, 3, 4, 5 })
            {
                Assert.AreEqual(value, queue.Peek(), "Peek returned the wrong item - should be in order.");
                Assert.IsFalse(queue.Empty, "Queue should not be empty yet.");
                Assert.AreEqual(value, queue.Pop(), "Pop returned the wrong item - should be in order.");
            }

            Assert.IsTrue(queue.Empty, "Queue should now be empty.");
            Assert.Throws<InvalidOperationException>(() => queue.Peek(), "Peeking at an empty queue should throw.");
            Assert.Throws<InvalidOperationException>(() => queue.Pop(), "Popping an empty queue should throw.");
        }
Exemple #31
0
        static void Method(string[] args)
        {
            int[] hwk = ReadInts();
            int   h   = hwk[0];
            int   w   = hwk[1];
            int   k   = hwk[2];

            bool[,] map = new bool[h, w];
            int sX = 0, sY = 0;

            for (int i = 0; i < h; i++)
            {
                string s = Read();
                for (int j = 0; j < w; j++)
                {
                    if (s[j] == '#')
                    {
                        continue;
                    }
                    if (s[j] == 'S')
                    {
                        sX = j;
                        sY = i;
                    }
                    map[i, j] = true;
                }
            }
            long[,] distances = new long[h, w];
            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    distances[i, j] = long.MaxValue / 4;
                }
            }
            int[] dx = new int[4] {
                1, -1, 0, 0
            };
            int[] dy = new int[4] {
                0, 0, 1, -1
            };
            PriorityQueue <int[]> queue = new PriorityQueue <int[]>();

            queue.Enqueue(0, new int[2] {
                sX, sY
            });
            while (queue.Count > 0)
            {
                var  pair     = queue.Dequeue();
                long distance = pair.Key;
                int  x        = pair.Value[0];
                int  y        = pair.Value[1];

                if (distance >= distances[y, x])
                {
                    continue;
                }

                distances[y, x] = distance;
                for (int i = 0; i < 4; i++)
                {
                    int nx = x + dx[i];
                    int ny = y + dy[i];
                    if (nx < 0 || w <= nx || ny < 0 || h <= ny)
                    {
                        continue;
                    }
                    long newDistance = distance + 1;
                    if (!map[ny, nx] && distance <= k)
                    {
                        newDistance = k + 1;
                    }

                    if (newDistance >= distances[ny, nx])
                    {
                        continue;
                    }
                    queue.Enqueue(newDistance, new int[2] {
                        nx, ny
                    });
                }
            }

            long res = long.MaxValue;

            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    if (i == 0 || i == h - 1 || j == 0 || j == w - 1)
                    {
                        long tmp = distances[i, j] / k;
                        if (distances[i, j] % k > 0)
                        {
                            tmp++;
                        }
                        res = Min(res, tmp);
                    }
                }
            }
            WriteLine(res);
        }
 public ChunkAwarePacketReceiver(LoadedChunks loadedChunks)
 {
     this.deferredPacketsByChunk = new Dictionary <Int3, Queue <Packet> >();
     this.receivedPackets        = new PriorityQueue <Packet>();
     this.loadedChunks           = loadedChunks;
 }
Exemple #33
0
        /// <summary>Run the Evalb scoring metric on guess/gold input.</summary>
        /// <remarks>Run the Evalb scoring metric on guess/gold input. The default language is English.</remarks>
        /// <param name="args"/>
        public static void Main(string[] args)
        {
            if (args.Length < minArgs)
            {
                log.Info(Usage());
                System.Environment.Exit(-1);
            }
            Properties options             = StringUtils.ArgsToProperties(args, OptionArgDefs());
            Language   language            = PropertiesUtils.Get(options, "l", Language.English, typeof(Language));
            ITreebankLangParserParams tlpp = language.@params;
            int  maxGoldYield      = PropertiesUtils.GetInt(options, "y", int.MaxValue);
            bool Verbose           = PropertiesUtils.GetBool(options, "v", false);
            bool sortByF1          = PropertiesUtils.HasProperty(options, "s");
            int  worstKTreesToEmit = PropertiesUtils.GetInt(options, "s", 0);
            PriorityQueue <Triple <double, Tree, Tree> > queue = sortByF1 ? new PriorityQueue <Triple <double, Tree, Tree> >(2000, new Evalb.F1Comparator()) : null;
            bool   doCatLevel = PropertiesUtils.GetBool(options, "c", false);
            string labelRegex = options.GetProperty("f", null);
            string encoding   = options.GetProperty("e", "UTF-8");

            string[] parsedArgs = options.GetProperty(string.Empty, string.Empty).Split("\\s+");
            if (parsedArgs.Length != minArgs)
            {
                log.Info(Usage());
                System.Environment.Exit(-1);
            }
            string goldFile  = parsedArgs[0];
            string guessFile = parsedArgs[1];

            // Command-line has been parsed. Configure the metric for evaluation.
            tlpp.SetInputEncoding(encoding);
            PrintWriter pwOut         = tlpp.Pw();
            Treebank    guessTreebank = tlpp.DiskTreebank();

            guessTreebank.LoadPath(guessFile);
            pwOut.Println("GUESS TREEBANK:");
            pwOut.Println(guessTreebank.TextualSummary());
            Treebank goldTreebank = tlpp.DiskTreebank();

            goldTreebank.LoadPath(goldFile);
            pwOut.Println("GOLD TREEBANK:");
            pwOut.Println(goldTreebank.TextualSummary());
            Evalb            metric   = new Evalb("Evalb LP/LR", true);
            EvalbByCat       evalbCat = (doCatLevel) ? new EvalbByCat("EvalbByCat LP/LR", true, labelRegex) : null;
            ITreeTransformer tc       = tlpp.Collinizer();
            //The evalb ref implementation assigns status for each tree pair as follows:
            //
            //   0 - Ok (yields match)
            //   1 - length mismatch
            //   2 - null parse e.g. (()).
            //
            //In the cases of 1,2, evalb does not include the tree pair in the LP/LR computation.
            IEnumerator <Tree> goldItr  = goldTreebank.GetEnumerator();
            IEnumerator <Tree> guessItr = guessTreebank.GetEnumerator();
            int goldLineId        = 0;
            int guessLineId       = 0;
            int skippedGuessTrees = 0;

            while (guessItr.MoveNext() && goldItr.MoveNext())
            {
                Tree           guessTree  = guessItr.Current;
                IList <ILabel> guessYield = guessTree.Yield();
                guessLineId++;
                Tree           goldTree  = goldItr.Current;
                IList <ILabel> goldYield = goldTree.Yield();
                goldLineId++;
                // Check that we should evaluate this tree
                if (goldYield.Count > maxGoldYield)
                {
                    skippedGuessTrees++;
                    continue;
                }
                // Only trees with equal yields can be evaluated
                if (goldYield.Count != guessYield.Count)
                {
                    pwOut.Printf("Yield mismatch gold: %d tokens vs. guess: %d tokens (lines: gold %d guess %d)%n", goldYield.Count, guessYield.Count, goldLineId, guessLineId);
                    skippedGuessTrees++;
                    continue;
                }
                Tree evalGuess = tc.TransformTree(guessTree);
                Tree evalGold  = tc.TransformTree(goldTree);
                metric.Evaluate(evalGuess, evalGold, ((Verbose) ? pwOut : null));
                if (doCatLevel)
                {
                    evalbCat.Evaluate(evalGuess, evalGold, ((Verbose) ? pwOut : null));
                }
                if (sortByF1)
                {
                    StoreTrees(queue, guessTree, goldTree, metric.GetLastF1());
                }
            }
            if (guessItr.MoveNext() || goldItr.MoveNext())
            {
                System.Console.Error.Printf("Guess/gold files do not have equal lengths (guess: %d gold: %d)%n.", guessLineId, goldLineId);
            }
            pwOut.Println("================================================================================");
            if (skippedGuessTrees != 0)
            {
                pwOut.Printf("%s %d guess trees\n", "Unable to evaluate", skippedGuessTrees);
            }
            metric.Display(true, pwOut);
            pwOut.Println();
            if (doCatLevel)
            {
                evalbCat.Display(true, pwOut);
                pwOut.Println();
            }
            if (sortByF1)
            {
                EmitSortedTrees(queue, worstKTreesToEmit, guessFile);
            }
            pwOut.Close();
        }
Exemple #34
0
 public SplPriorityQueue()
 {
     _queue = new PriorityQueue <Pair>(this);
 }
    public static List <int> DijkstraAlgorithm(Dictionary <Node, Dictionary <Node, int> > graph, Node sourceNode, Node destinationNode)
    {
        int?[] previous = new int?[graph.Count];
        bool[] visited  = new bool[graph.Count];

        PriorityQueue <Node> priorityQueue = new PriorityQueue <Node>();

        foreach (var pair in graph)
        {
            pair.Key.DistanceFromStart = double.PositiveInfinity;
        }

        sourceNode.DistanceFromStart = 0;
        priorityQueue.Enqueue(sourceNode);

        while (priorityQueue.Count > 0)
        {
            var currentNode = priorityQueue.ExtractMin();

            if (currentNode == destinationNode)
            {
                break;
            }

            foreach (var edge in graph[currentNode])
            {
                if (!visited[edge.Key.Id])
                {
                    priorityQueue.Enqueue(edge.Key);
                    visited[edge.Key.Id] = true;
                }

                double distance = currentNode.DistanceFromStart + edge.Value;

                if (distance < edge.Key.DistanceFromStart)
                {
                    edge.Key.DistanceFromStart = distance;
                    previous[edge.Key.Id]      = currentNode.Id;
                    priorityQueue.DecreaseKey(edge.Key);
                }
            }
        }

        if (double.IsInfinity(destinationNode.DistanceFromStart))
        {
            return(null);
        }

        List <int> path    = new List <int>();
        int?       current = destinationNode.Id;

        while (current != null)
        {
            path.Add(current.Value);
            current = previous[current.Value];
        }

        path.Reverse();

        return(path);
    }
Exemple #36
0
        static void Method(string[] args)
        {
            int[] nk = ReadInts();
            int   n  = nk[0];
            int   k  = nk[1];

            int[] ps = ReadInts();

            HashSet <long>       hashSet   = new HashSet <long>();
            PriorityQueue <bool> ascQueue  = new PriorityQueue <bool>();
            PriorityQueue <bool> descQueue = new PriorityQueue <bool>();
            int incCnt = 0;

            for (int i = 0; i < k; i++)
            {
                hashSet.Add(ps[i]);
                ascQueue.Enqueue(ps[i], true);
                descQueue.Enqueue(-ps[i], true);
                if (i > 0 && ps[i] > ps[i - 1])
                {
                    incCnt++;
                }
                else
                {
                    incCnt = 0;
                }
            }
            bool ordered = incCnt == k - 1;
            int  res     = 1;

            for (int i = 1; i + k <= n; i++)
            {
                if (ps[i + k - 1] > ps[i + k - 2])
                {
                    incCnt++;
                }
                else
                {
                    incCnt = 0;
                }
                if (ascQueue.Top().Key == ps[i - 1] &&
                    -descQueue.Top().Key < ps[i + k - 1])
                {
                }
                else if (ordered && incCnt == k - 1)
                {
                }
                else
                {
                    res++;
                }
                hashSet.Remove(ps[i - 1]);
                hashSet.Add(ps[i + k - 1]);
                ascQueue.Enqueue(ps[i + k - 1], true);
                descQueue.Enqueue(-ps[i + k - 1], true);
                while (!hashSet.Contains(ascQueue.Top().Key))
                {
                    ascQueue.Dequeue();
                }
                while (!hashSet.Contains(-descQueue.Top().Key))
                {
                    descQueue.Dequeue();
                }
                if (incCnt == k - 1)
                {
                    ordered = true;
                }
            }
            WriteLine(res);
        }
Exemple #37
0
        public void Fitting(Func <CompressedTimeSpan, float> originalCurve, CompressedTimeSpan stepSize, float maxErrorThreshold)
        {
            // Some info: http://wscg.zcu.cz/wscg2008/Papers_2008/full/A23-full.pdf
            // Compression of Temporal Video Data by Catmull-Rom Spline and Quadratic Bézier Curve Fitting
            // And: http://bitsquid.blogspot.jp/2009/11/bitsquid-low-level-animation-system.html

            // Only one or zero keys: no need to do anything.
            if (KeyFrames.Count <= 1)
            {
                return;
            }

            var keyFrames = new LinkedList <KeyFrameData <float> >(this.KeyFrames);
            var evaluator = new Evaluator(keyFrames);

            // Compute initial errors (using Least Square Equation)
            var errors = new LinkedList <ErrorNode>();
            //var errors = new List<float>();
            var errorQueue = new PriorityQueue <LinkedListNode <ErrorNode> >(new ErrorComparer());

            foreach (var keyFrame in keyFrames.EnumerateNodes())
            {
                if (keyFrame.Next == null)
                {
                    break;
                }
                var error     = EvaluateError(originalCurve, evaluator, stepSize, keyFrame.Value, keyFrame.Next.Value);
                var errorNode = errors.AddLast(new ErrorNode(keyFrame, error.Key, error.Value));
                errorQueue.Enqueue(errorNode);
            }
            //for (int keyFrame = 0; keyFrame < KeyFrames.Count - 1; ++keyFrame)
            //{
            //    //errors.Add(EvaluateError(originalCurve, evaluator, stepSize, keyFrame));
            //    var errorNode = errors.AddLast(new ErrorNode(EvaluateError(originalCurve, evaluator, stepSize, keyFrame)));
            //    errorQueue.Enqueue(errorNode);
            //}

            while (true)
            {
                // Already reached enough subdivisions
                var highestError = errorQueue.Dequeue();
                if (highestError.Value.Error <= maxErrorThreshold)
                {
                    break;
                }

                //// Find segment to optimize
                //var biggestErrorIndex = 0;
                //for (int keyFrame = 1; keyFrame < KeyFrames.Count - 1; ++keyFrame)
                //{
                //    if (errors[keyFrame] > errors[biggestErrorIndex])
                //        biggestErrorIndex = keyFrame;
                //}

                //// Already reached enough subdivisions
                //if (errors[biggestErrorIndex] <= maxErrorThreshold)
                //    break;

                // Create new key (use middle point, but better heuristic might improve situation -- like point with biggest error)
                //var middleTime = (start.Value.Time + end.Value.Time) / 2;
                var middleTime = highestError.Value.BiggestDeltaTime;
                //KeyFrames.Insert(biggestErrorIndex + 1, new KeyFrameData<float> { Time = middleTime, Value = originalCurve(middleTime) });
                var newKeyFrame = keyFrames.AddAfter(highestError.Value.KeyFrame, new KeyFrameData <float> {
                    Time = middleTime, Value = originalCurve(middleTime)
                });
                //errors.Insert(biggestErrorIndex + 1, 0.0f);
                var newError = errors.AddAfter(highestError, new ErrorNode(newKeyFrame, CompressedTimeSpan.Zero, 0.0f));

                var highestErrorLastUpdate = newError;
                if (highestErrorLastUpdate.Next != null)
                {
                    highestErrorLastUpdate = highestErrorLastUpdate.Next;
                }

                // Invalidate evaluator (data changed)
                evaluator.InvalidateTime();

                // Update errors
                for (var error = highestError.Previous ?? highestError; error != null; error = error.Next)
                {
                    if (error != highestError && error != newError)
                    {
                        errorQueue.Remove(error);
                    }

                    var errorInfo = EvaluateError(originalCurve, evaluator, stepSize, error.Value.KeyFrame.Value, error.Value.KeyFrame.Next.Value);
                    error.Value.BiggestDeltaTime = errorInfo.Key;
                    error.Value.Error            = errorInfo.Value;

                    errorQueue.Enqueue(error);

                    if (error == highestErrorLastUpdate)
                    {
                        break;
                    }
                }
            }

            KeyFrames = new List <KeyFrameData <float> >(keyFrames);
        }