Haskell优化算法

K个最大(最小)元素的算法

2019-03-22  本文已影响0人  DarkBubble

问题描述:给定具有N个元素的全序集合A,比较算符为<=,求最大的K<=N个元素,不要求排序。下面按照取K个最小值的情况讨论。
基本思想:类似于快速排序法,选择一个元素将其插入到数组的一个位置,使得左侧的元素都小于等于该标记元素,右侧元素都大于等于该元素。


参考Haskell代码:

ksplit 0 xs = ([], xs)
ksplit k xs
    = let x = head xs
          xs1 = filter (<  x) xs
          xs2 = filter (== x) xs
          xs3 = filter (>  x) xs
          n1  = length xs1
          n2  = length xs2 + n1
          n3  = length xs3 + n2
      in  if k > length xs
          then error "not_enough_elements"
          else if k == n1
               then (xs1, xs2 ++ xs3)
               else if k == n2
                    then (xs1 ++ xs2, xs3)
                    else if k == n3
                         then (xs, [])
                         else if k < n1
                              then let (ys1, ys2) = ksplit k xs1
                                   in  (ys1, ys2 ++ xs2 ++ xs3)
                              else if k < n2 -- k \in (n1, n2)
                                   then (xs1 ++ take (k - n1) xs2, take (n2 - k) xs2 ++ xs3)
                                   else let (ys1, ys2) = ksplit (k - n2) xs3 -- k \in (n2, n3)
                                        in  (xs1 ++ xs2 ++ ys1, ys2)


上一篇 下一篇

猜你喜欢

热点阅读