数字之间的最小差异

时间:2013-04-11 09:53:46

标签: algorithm sorting minimum

我们有K组不同的数字。我们必须从每个集合中选择一个数字,以便较高和较低数字之间的差异是最小值

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

像这样(用Haskell编写)?

import Data.List (minimum, maximum, minimumBy)

minDiff (x:xs) = comb (head x) (diff $ matches (head x)) x where
  lenxs = length xs
  diff m = maximum m - minimum m
  matches y = minimumBy (\a b -> compare (diff a) (diff b)) $ p [] 0 where
    md = map (minimumBy (\a b -> compare (abs (a - y)) (abs (b - y)))) xs
    mds = [m | m <- foldl (\b a -> filter (\z -> abs (z - y) == abs (y - md!!a)) (xs!!a) : b) [] [0..lenxs - 1]]
    p result index
      | index == lenxs = [y:result]
      | otherwise      = do
          p' <- mds!!index
          p (p':result) (index + 1)
  comb result difference []     = matches result
  comb result difference (z:zs) =
    let diff' = diff (matches z)
    in if diff' < difference
          then comb z diff' zs
          else comb result difference zs


OUTPUT:
*Main> minDiff [[1,3,5,9,10],[2,4,6,8],[7,11,12,13]]
[5,6,7]