BlueRaja / High-Speed-Priority-Queue-for-C-Sharp

A C# priority queue optimized for pathfinding applications
MIT License
1.15k stars 169 forks source link

FastQueue doesn't return some nodes in some cases #49

Closed iRumba closed 4 years ago

iRumba commented 4 years ago

I give you one case

image

        [Test]
        public void TestEveryDequeued()
        {
            TQueue queue2 = CreateQueue();
            var node1 = new Node(1);
            var node2 = new Node(1);
            var node3 = new Node(1);

            queue2.Enqueue(node1, 1);
            queue2.Enqueue(node2, 1);
            queue2.Enqueue(node3, 1);

            var dequeuedNodes = new List<Node>();

            for (var i = 0; i < 1000; i++)
            {
                dequeuedNodes.Add(queue2.Dequeue());
                queue2.Enqueue(new Node(1), 1);
            }

            Assert.Contains(node1, dequeuedNodes);
            Assert.Contains(node2, dequeuedNodes);
            Assert.Contains(node3, dequeuedNodes);
        }

Second assertion will failed with any number of iterations

My first debug was on paper by code :)

image

You can see what happenes

BlueRaja commented 4 years ago

You're not dequeuing every node in the queue, so that test shouldn't necessarily be expected to pass...

As mentioned in the documentation, FastPriorityQueue is not stable, meaning if multiple nodes have the same priority, the order they're dequeued is arbitrary. If you need a stable queue, use StablePriorityQueue instead.

iRumba commented 4 years ago

As mentioned in the documentation, FastPriorityQueue is not stable, meaning if multiple nodes have the same priority, the order they're dequeued is arbitrary. If you need a stable queue, use StablePriorityQueue instead.

But it means We have not stable lib. See docs. :)

You can change this behavior. Fast method is change all usings HasHigherPriority to HasHigherOrEqualPriority in CascadeDown method. You can try.

BlueRaja commented 4 years ago

No, that is not sufficient to make the data structure stable.