从haskell中的列表中删除重复值
我需要在Haskell中完成一些任务:从haskell中的列表中删除重复值,haskell,Haskell,我需要在Haskell中完成一些任务: 查找列表的最大值及其出现的次数: maxCount [2,4,7,2,3] --> [7,1] 从列表中删除重复的值 delRep [1,3,2,1,4] --> [3,2,4] 从列表中删除元素的所有实例: delete [1,3,4,1] 1 --> [3,4] 问题1 maxAndReps l = let m = maximum l reps = length $ filter (=
maxCount [2,4,7,2,3] --> [7,1]
delRep [1,3,2,1,4] --> [3,2,4]
delete [1,3,4,1] 1 --> [3,4]
maxAndReps l = let m = maximum l
reps = length $ filter (== m) l
in [m,reps]
这个解的渐近性能非常差,因为列表被遍历了两次。理想情况下,解决方案将找到最大值并计算一次过程中的重复次数。如果以折叠方式编写最大值
、过滤器
和长度
,您应该了解如何将它们组合成一个过程
而且,返回元组而不是列表会更自然
问题2。查看如何使用Data.Set.Set
。此外,输出列表是否需要按相同的顺序排列?如果不是,有一个特别简单的解决方案
问题3。我以上对问题1的回答涵盖了这一点。该函数从列表中删除所有非最大值,这正是问题所在。只要弄清楚它是如何工作的,你就可以解决这个问题。没有内置函数。。看起来很难看:D 对第一个做了一点修改,不喜欢只对整数起作用
-- 1.
maxic :: Ord a => [a] -> (a, Integer)
maxic xs = (x,c)
where x = maxi xs
where maxi :: Ord a => [a] -> a
maxi [] = error "empty list"
maxi (x:xs) = iter xs x
where iter [] m = m
iter (x:xs) m | x > m = iter xs x
iter (_:xs) m = iter xs m
c = cnt xs x
where cnt :: Eq a => [a] -> a -> Integer
cnt (x:xs) e | x==e = 1 + (cnt xs e)
cnt (_:xs) e = cnt xs e
cnt _ _ = 0
-- 2.
remrep :: Eq a => [a] -> [a]
remrep xs = reverse (iter xs [])
where iter (x:xs) res | elem x res = iter xs (filter (/= x) res)
iter (x:xs) res = iter xs (x:res)
iter [] res = res
-- 3.
remo :: Eq a => [a] -> a -> [a]
remo [] e = []
remo (x:xs) e | x==e = remo xs e
remo (x:xs) e = (x : remo xs e)
好吧,我作弊了,我用了,过滤器,但是你可以用
remo
来做这个,而且elem
写起来应该很简单。你试过什么,你到底不明白什么?我们不是来为你写代码的。@John L我会说:这是家庭作业吗?如果是的话,那就先试试,否则我拒绝回答,除非你付钱给我。很多。@Ziyao Wei:我心情很好,所以我试着帮忙。我考虑过写一个模糊的响应,但我不想那么努力。@John L你至少可以用pointfree
来模糊一点!我对问题进行了编辑,使其看起来像样(并添加了家庭作业标签),但我仍然不喜欢提问的方式。您可能对使用感兴趣。您确定这是O(n^2)吗?也就是说,maximum
afilter
不应该都是O(n)?这肯定是O(n),而不是O(n^2),更不用说O(kn^2)。我所看到的唯一渐进性能问题是内存的线性使用,因为列表被多次遍历。@hvr和@Rotsor,你们都是对的。就寝后教我继续这样做。我已经把它修好了一点。+1很好的指导,但没有为他解决问题。-1感谢他为他做了完整的家庭作业,特别是没有指导或解释。你能为练习3提供什么指导?说真的,如果他太懒,地球上没有任何指导会有帮助。。。我这样做只是为了好玩,几天前学了一些基础知识。也许只是把你的手指指向filter
函数,让他知道如何使用它。他可能处于基础水平(学习模式匹配、处理列表,所有这些东西,你知道……),应该在没有任何“花哨”内置的情况下解决这个问题。那不是我所说的指导。那就不要说关于#3?让他开始对付其他人。我知道你只是在享受实现这一点的乐趣,但这并不意味着你需要给他额外的懒惰机会。不管怎样,我只是按照我的价值观投票。