haskell - 计算列表中每个元素的所有出现次数

如何有效地计算列表中每个元素的所有出现次数?我想过使用关联列表或一些 HashMap ,但不可变性妨碍了它,而且显然不清楚应该如何(希望如此)优雅的解决方案。

签名可能是这样的:

countOccurences :: [a] -> [(a, Int)]

例子:

countOccurences [1, 1, 2, 3, 1, 2, 4] 

结果

[(1, 3), (2, 2), (3, 1), (4, 1)]

(尽管顺序并不重要)。

最佳答案

组。 sort 将产生一个输出列表,例如

> group . sort $ [1, 1, 2, 3, 1, 2, 4] 
[[1,1,1],[2,2],[3],[4]]

因此,

> map (head &&& length) . group . sort $ [1, 1, 2, 3, 1, 2, 4] 
[(1,3),(2,2),(3,1),(4,1)]

所以,我们得到

import Data.List (group, sort)
import Control.Arrow ((&&&))

countOccurences :: Ord a => [a] -> [(a, Int)]
countOccurences = map (head &&& length) . group . sort

它应该只需要 O(n log n) 时间。

https://stackoverflow.com/questions/55143882/

相关文章:

csv - 将 CSV 文件导入为矩阵

list - Haskell:列表操作

angular - MatAutocomplete 值 X 显示

ruby-on-rails - 捆绑安装不适用于 bundler 2.0.1 的 rails-4.2

bash - 如何获取 `ls` 命令的前 n 行

sql - 根据一列删除 Select 查询中的重复项

hibernate - 当我从 POST 方法更新它时,@CreationTimestamp 列设置

websocket - 错误 : Error when readinrror: Error when

amazon-web-services - 如何在 SQS 队列下添加超过 20 个策略语句 - 权

java - 如何用 java 将换行符替换为 "\n"?