Haskell 对数据进行排序。按值映射并获取所有最大值
我有数据。地图如下所示:Haskell 对数据进行排序。按值映射并获取所有最大值,haskell,Haskell,我有数据。地图如下所示: fromList [("eso",1),("mes",1),("ome",2),("som",2)] 我需要从这张地图中获取最大值的键列表: ["ome","som"] 以下是我的解决方案: get_max_from_map m = map fst (filter is_biggest sorted) where sorted = List.sortBy (\(k1, v1) (k2, v2) -> v2 `compare` v1) $ Map.toL
fromList [("eso",1),("mes",1),("ome",2),("som",2)]
我需要从这张地图中获取最大值的键列表:
["ome","som"]
以下是我的解决方案:
get_max_from_map m = map fst (filter is_biggest sorted)
where sorted = List.sortBy (\(k1, v1) (k2, v2) -> v2 `compare` v1) $ Map.toList m
max_v = snd $ head sorted
is_biggest (key, value) = value == max_v
我将映射转换为列表,对它们进行排序,得到第一个值作为最大值并过滤列表
我只是想知道这个任务是否有更完美的解决方案
谢谢。您可以使用
Maybe
monad中的Data.Map
函数来处理此问题
编辑:这是一个使用导入的工作版本
导入控制。镜头
导入数据.Map(Map)
导入符合条件的数据。映射为映射
Eq a=>映射k a->可能[k]
getYourKeys m=do
maxValue您需要执行两项任务-查找最大值、筛选
get_max_from_lst xs = map fst $ filter ((== m) . snd) xs
where m = maximum $ map snd xs
这是名单
如果我们有地图,那么:
import Data.Map.Lazy as M
get_max_from_map xs = M.keys $ M.filter (== m) xs
where m = maximum $ M.elems xs
这并不比你原来的帖子简单,但它的优点是,它是一个线性时间,一次通过的解决方案(你的版本是O(n log n),因为它对列表进行排序,到目前为止发布的其他答案是两次通过的解决方案)
getMaxFromMap m=go[]无(Map.toList m)
哪里
go ks[]=ks
去(k,v):休息)=去(k:ks)(只是v)休息
走(只剩下u)(k,v):休息)
|vu=go[k](只是v)休息
|否则=去(k:ks)(只是v)休息
< /代码>如果没有理由进行快速查找,您可能需要考虑使用堆而不是映射。对于堆,最大的元素总是最顶层的元素,因此很容易访问。呃,这实际上是不正确的,只是碰巧适用于您的特定用例<代码>映射。maxView
作用于键,而不是值。我将在一两分钟内解决/删除此问题。(更新:修复)我认为您需要首先将参数转换为列表。
import Data.Map.Lazy as M
get_max_from_map xs = M.keys $ M.filter (== m) xs
where m = maximum $ M.elems xs
getMaxFromMap m = go [] Nothing (Map.toList m)
where
go ks _ [] = ks
go ks Nothing ((k,v):rest) = go (k:ks) (Just v) rest
go ks (Just u) ((k,v):rest)
| v < u = go ks (Just u) rest
| v > u = go [k] (Just v) rest
| otherwise = go (k:ks) (Just v) rest