You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Haskell实现按最小距离统计list1相对list2的元素分类计数

问题核心原因

你原来的列表推导会遍历list2的所有元素,只要存在任意一个y满足距离条件就会把x计入结果,既没有先取每个x对应的最小距离,也会因为多个y满足条件导致同一个x被重复计数,不符合按最小距离唯一分类的要求。

实现方案

核心逻辑是先对每个list1中的元素,先计算它到所有list2元素的最小距离,再按最小距离分类统计:

  1. 统计最小距离为1的元素数量:
countDist1 = length [x | x <- list1, let minDist = minimum $ map (generateDist x) list2, minDist == 1]
  1. 统计最小距离为2的元素数量:
countDist2 = length [x | x <- list1, let minDist = minimum $ map (generateDist x) list2, minDist == 2]

示例验证

用你给出的测试用例验证:
list1 = [1,4,7],list2 = [2,3,6],计算每个x的最小距离:

  • 元素1:最小距离为1(到2的距离)
  • 元素4:最小距离为1(到3的距离)
  • 元素7:最小距离为1(到6的距离)
    最终得到countDist1 = 3,countDist2 = 0,完全符合预期结果。

扩展方案(一次性统计所有距离的分布)

如果需要一次性得到所有距离对应的元素数量,可以用分组统计实现:

import Data.List (group, sort)

-- 输出格式为 [(距离值, 对应元素个数)]
distStatistics = map (\g -> (head g, length g)) $ group $ sort [minimum $ map (generateDist x) list2 | x <- list1]

你的测试用例运行后返回结果为[(1,3)],符合预期。

内容的提问来源于stack exchange,提问作者Xuanjian Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:15:02