[Haskell-cafe] Re: (flawed?) benchmark : sort

Don Stewart dons at galois.com
Sun Mar 9 23:08:32 EDT 2008


dan.doel:
> On Sunday 09 March 2008, Krzysztof Skrzętnicki wrote:
> > Ok, I did some search and found Data.Map, which can be used to implement
> > pretty fast sorting:
> >
> > import qualified Data.Map as Map
> >
> > treeSort :: Ord a => [a] -> [a]
> > treeSort = map (\(x,_) -> x ) . Map.toAscList . Map.fromList . map
> > (\x->(x,()))
> >
> > In fact It is likely to behave like sort, with the exception that it is 23%
> > faster. I did not hovever check the memory consumption. It works well on
> > random, sorted and reverse-sorted inputs, and the speed difference is
> > always about the same. I belive I could take Data.Map and get datatype
> > isomorphic to specialized *Data.Map a ()* of it, so that treeSort will
> > became Map.toAscList . Map.fromList. This may also bring some speedup.
> >
> > What do you think about this particular function?
> 
> Some thoughts:
> 
> 1) To get your function specifically, you could just use Data.Set.Set a 
> instead of Map a ().
> 
> 2) What does it do with duplicate elements in the list? I expect it deletes 
> them. To avoid this, you'd need to use something like fromListWith, keeping 
> track of how many duplicates there are, and expanding at the end.

And a little QuickCheck to help things along:

    import qualified Data.Map as Map
    import Data.List
    import Test.QuickCheck

    treeSort :: Ord a => [a] -> [a]
    treeSort = map (\(x,_) -> x ) . Map.toAscList . Map.fromList . map (\x->(x,()))

    main = quickCheck prop_sort

    prop_sort xs = sort xs == treeSort xs
        where _ = xs :: [Int]

Running:

    $ runhaskell A.hs
    Falsifiable, after 11 tests:
    [-2,-2,5]


More information about the Haskell-Cafe mailing list