[Haskell-cafe] Implementation of the Floyd-Warshall algorithm

Bulat Ziganshin bulat.ziganshin at gmail.com
Fri Jul 28 06:56:57 EDT 2006


Hello frederic,

Friday, July 28, 2006, 10:44:51 AM, you wrote:

> much slower than the C version.  I would be very grateful if someone
> cared to explain why this is unefficient and how to make it faster

update :: STUArray s (Int, Int) Double -> Int -> Int -> Int -> ST s ()
update arr i j k = do aij <- readArray arr (i, j)

try

update arr i j k | arr `seq` i `seq` j `seq` k `seq` True = do aij <- readArray arr (i, j)

and make the same changes in other update functions. we has
http://haskell.org/haskellwiki/Performance page, you should read it

second problem is bounds checking in readArray. if you want better
speed, you should use unsafeRead/unsafeWrite and compute index with
something like (i*count+j)

btw, 'newArray ((0, 0), (10, 10))' creates array with 121 elements. is
this what you really need?

also, "foreach=flip mapM_" will be useful for you. i also recommend
you to read http://haskell.org/haskellwiki/IO_inside - ST monad
differs from IO one only in what its operations are restricted to
array/reference ones


-- 
Best regards,
 Bulat                            mailto:Bulat.Ziganshin at gmail.com



More information about the Haskell-Cafe mailing list