2013-04-11 5 views
2

우리는 K 개의 다른 숫자 집합을 가지고 있습니다. 더 높은 숫자와 낮은 숫자의 차이가 이되도록 각 세트에서 숫자를 선택해야합니다.숫자 사이의 최소 차이

아이디어가 있으십니까?

+0

각 세트에 몇 개의 요소가 있습니까? K가 얼마나 클 수 있습니까? – gkiko

+0

각 세트에서 최소값을 선택하면 효과가 있습니까? – dekdev

+1

@ simplecoder : 분명히 아닙니다; 간단하게 두 세트 {1,2,3}과 {-3, -2, -1}을 고려해 보자. –

답변

0

이와 비슷한 것 (하스켈로 작성)?

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

하스켈을 모르는 사람 (또는 적어도 읽기 어렵습니다)에게는 아마 읽을 수 없습니다. 알고리즘 설명을 제공 할 때 알고리즘 설명, 주석 및/또는 의사 코드를 포함 시키십시오. – Dukeling