[Haskell-beginners] Help with slow algorithm

Diego Echeverri diegoeche at gmail.com
Fri May 14 22:00:06 EDT 2010


Hi Daniel. Thanks for your answer.

> One point: Packing a long list is bad. That takes a lot of memory and is
> slow, if you create a list, it's going to be faster to use normal String-IO
> to output it.

The thing is that later I do some operations with it (solve). just by
changing to ByteString
everything got faster.


> Another point: biggerOrEquals is also too slow. Using the Ord instance for
> ByteStrings will be faster. But I think splitting the ByteStrings isn't the
> best way.

The Ord instance of ByteStrings is lexicographic. This way:

B.pack "1111"  > B.pack "112" ==> False

Although given the fact that both strings would be the same length,
the Ord instance may work just fine.

> Third point: Use STUArrays and not STArrays if possible (much faster).

Not sure if those are available in the Online Judge. I'll try it.

Thanks Again!


On Fri, May 14, 2010 at 8:42 PM, Daniel Fischer
<daniel.is.fischer at web.de> wrote:
> On Saturday 15 May 2010 03:13:24, Diego Echeverri wrote:
>> Hi guys.
>>
>> I've been playing with https://www.spoj.pl/ to get better with Haskell.
>> I'm trying to do: https://www.spoj.pl/problems/PALIN/
>>
>> Basically given a number k, you have to find a number bigger than k
>> that is palindrome. The thing is that k can be 1000000 digits long.
>>
>> I have learnt a bunch of things doing this exercise but I'm still
>> getting time-limit exception.
>>
>> Here's the code: http://gist.github.com/401880
>>
>> I believe that the bottleneck is in the addOne function (Specially in
>> the case where you have a bunch of nines). I have rewritten it to use
>> STArray but isn't fast enough.
>> doing: addOne $ B.replicate 500000 'a' takes too much time!
>>
>> Can anybody point me out of better (faster) ways to improve the code?
>> I don't need my code fixed, just suggestions and clues about things to
>> try.
>>
>> Thanks!
>> Diego Echeverri
>
> One point: Packing a long list is bad. That takes a lot of memory and is
> slow, if you create a list, it's going to be faster to use normal String-IO
> to output it.
>
> Another point: biggerOrEquals is also too slow. Using the Ord instance for
> ByteStrings will be faster. But I think splitting the ByteStrings isn't the
> best way.
>
> Third point: Use STUArrays and not STArrays if possible (much faster).
>



-- 
Att: Diego Echeverri Saldarriaga


More information about the Beginners mailing list