2013-04-11 77 views
2

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

任何想法?

+0

每组中有多少个元素? K有多大? – gkiko 2013-04-11 10:25:04

+0

如果您从每组中选择最小值 - 是否可行? – dekdev 2013-04-11 10:30:11

+1

@simplecoder:显然不是;简单地考虑两组{1,2,3}和{-3,-2,-1} – 2013-04-11 10:34:29

回答

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] 
+2

对于任何不了解Haskell的人来说(或者至少难以阅读)可能是不可读的。尝试在给出算法答案时包含算法描述,注释和/或伪代码。 – Dukeling 2013-04-12 07:46:25