[Haskell-cafe] Performance question

Arnoldo Muller arnoldomuller at gmail.com
Thu Mar 18 14:59:33 EDT 2010


Hello!

I am trying to implement a binary search function that returns the index of
an
exact or the (index + 1) where the item should be inserted in an array if
the item to be searched is not found (I am not trying to insert data in the
array) .

Right now, the bottleneck of my program is in binarySearch', the function
must be called a few billion times.

Do you have any ideas on how to improve the performance of this function?

import Data.Array.IArray

type IntArray a = Array Int a

-- The array must be 0 indexed.
binarySearch :: Ord a =>  a ->  IntArray a  -> Int
binarySearch query array =
    let (low, high) = bounds array
    in
       binarySearch' query array low high


binarySearch' :: Ord a =>  a ->  IntArray a -> Int -> Int -> Int
binarySearch' query array !low !high
    | low <= high = let ! mid = low + ((high - low) `div` 2)
                                 ! midVal = array !
mid
                               in next mid midVal
    | otherwise = -(low + 1)
    where next mid midVal
               |  midVal < query = binarySearch' query array  (mid + 1) high
               |  midVal > query = binarySearch' query array  low  (mid - 1)
               |  otherwise = mid


Thank you!

Arnoldo Muller
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100318/38296959/attachment.html


More information about the Haskell-Cafe mailing list