【问题标题】:how can I easily get the two biggest elements of an array?如何轻松获取数组的两个最大元素?
【发布时间】:2021-05-19 14:55:23
【问题描述】:

这不是一个难题,但是我不写5行或更多行就找不到解决方案。

我想要以下函数的定义:

-- takes a list and give back the 2 biggest elements
getTwoBiggest :: [Int] -> (Int, Int)

编辑

我可以通过排序并获取前 2 个元素来做到这一点,但我没有找到按降序对列表进行排序的明确文档。

我该怎么做? 和Down这个类型有什么联系?

【问题讨论】:

  • Haskell 的排序是惰性的,所以如果 k 是固定的,你会得到 O(n)中的前 k 个元素>.
  • @WillemVanOnsem 你确定它不依赖于排序吗?无论如何,我怎样才能按降序对我的列表进行排序?
  • 您可以使用map (\(Down a) -> a) . sort . map Down。如果您在启用优化的情况下进行编译,这将产生与使用sortBy 获得的完全相同的二进制代码。
  • getDown :: Down a -> a 已定义。

标签: list haskell max


【解决方案1】:

要获得以相反顺序排序的列表,您应该使用sortByDown

如果您不认识他们,可以通过 hoogle 轻松找到他们的文档:

https://hoogle.haskell.org/?hoogle=Down

https://hoogle.haskell.org/?hoogle=sortBy

sortBy 允许您指定自定义比较函数。

Down 是一个新类型包装器,用于反转它所包装类型的排序顺序(由 Ord 实例指定)。

将这些与一些错误处理放在一起将为您提供:

import Data.Ord
import Data.List

getTwoBiggest :: [Int] -> (Int, Int)
getTwoBiggest xs | (x:y:_) <- reverseSort xs = (x,y)
                 | otherwise = undefined -- hande lists with less than two elements
    where reverseSort = sortBy (comparing Down)

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 2021-03-07
    • 2019-10-26
    • 2022-08-16
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    相关资源
    最近更新 更多