On Jun 8, 2005, at 7:13 AM, Gracjan Polak wrote:

Tomasz Zielonka wrote:
[Data.Map can be used to implement priority queues]

Wow, I did not think about this.

As far as I remember in imperative world priority queues had special implementation, with very good O() characteristics. Is O(log N) the best thing that can bo done in pure functional setting?

Either insertion or deletion must be amortized O(lg N) unless you're using bounded priorities. Otherwise you'd be able to sort in better than O(N lg N) time by using a new improved queue--and that, of course, is impossible. It doesn't matter what setting you're in.

For bounded priorities, it would be nice to see similar functionality in Data.IntMap. There, you have to squint funny, but stuff takes constant time if you assume the number of bits in a word (I believe this is W in the HaskellDoc) doesn't change. In practice you'd only pay for as many bits as you use (so if you use keys between -512 and 511, W=10 rather than, say, 32).

To put it another way: is Data.Map only workaround to get something done, or is it The Right Way of doing PQs in Haskell?

I believe there are heap data structures that make one or the other operation (insert or deleteMin) O(1). You might try one of Okasaki's heap implementations from "Purely Functional Data Structures". Heaps don't need to support lookup, and can focus on doing insertion and deletion well.

-Jan-Willem Maessen


Best regards
Tomasz

--
Gracjan
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to