1. Job Roadmap
  2. Home
  3. Problem Set
  4. codenotelist
  5. Forum
  6. course
  7. Shore Share Sessions
  8. Record
  1. Login
  2. Sign Up
  3. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
    ZhContent TextSol AI分析
会员专享
请先登录,登录后可使用今日免费解锁; 开通会员,或 购买 该题目所属题库(美团机考编程题库) ,可解锁完整内容。
购买题库 开通会员

题解思路

1. 预处理点与点之间的距离

题目要求使用欧氏距离:

d((x1,y1),(x2,y2))=(x1−x2)2+(y1−y2)2d((x_1,y_1),(x_2,y_2))=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2} d((x1​,y1​),(x2​,y2​))=(x1​−x2​)2+(y1​−y2​)2​

P4955.第1题-HAC聚类器

    3000ms Tried: 2 Accepted: 1 Difficulty: 6 所属公司 : 美团
    算法与标签>贪心算法

题目内容

小美正在学习聚类算法,请你帮助她实现单链接层次聚类(HierarchicalHierarchicalHierarchical AgglomerativeAgglomerativeAgglomerative ClusteringClusteringClustering, HACHACHAC, Single−linkageSingle-linkageSingle−linkage)。

你需要在仅使用 numpy/pandas/scikit−learnnumpy / pandas / scikit-learnnumpy/pandas/scikit−learn 的前提下,将 nnn 个二维点合并到指定簇数 CCC,并为原始每个点输出簇编号。

  1. 距离定义

    d((x1,y1),(x2,y2))=(x1−x2)2+(y1−y2)2d((x_1,y_1),(x_2,y_2)) = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} d((x1​,y1​),(x2​,y2​))=(x1​−x2​)2+(y1​−y2​)2​
  2. 初始化

    • 每个点自成一簇;簇的成员索引集合为 {idxidxidx}(idxidxidx 为输入顺序下标)
  3. 迭代合并(直到簇数=C) i. 计算簇间距离 - 对任意两簇 A、BA、BA、B:D(A,B)=min⁡p∈A,q∈Bd(p,q)D(A,B) = \min_{p \in A, q \in B} d(p,q)D(A,B)=minp∈A,q∈B​d(p,q) ii. 确定要合并的簇对 - 找到最小距离 DminD_{min}Dmin​ 的所有簇对集合 PPP - 消除平局,依次比较: a. 第一关键字:较小簇对(minminmin AAA, minminmin BBB)中的最小索引 b. 第二关键字:较大簇对(minminmin AAA, minminmin BBB)中的次小索引 - 说明:设 a=min⁡(A),b=min⁡(B)a=\min(A), b=\min(B)a=min(A),b=min(B) 并令 a<ba < ba<b,则关键字序列为 (a,b)(a,b)(a,b)。比如若簇对 (0,3)(0,3)(0,3) 与 (1,2)(1,2)(1,2) 距离相同,则比较 (0,3)(0,3)(0,3) 与 (1,2)(1,2)(1,2),取 (0,3)(0,3)(0,3) - 取数字序最小的簇对作为本轮合并目标 iii. 合并簇 - 新簇成员 = A∪BA \cup BA∪B - 重复步骤 i-iii,直到簇数 =C=C=C

  4. 簇编号映射(输出一致性) 合并结束后得到 CCC 个簇 {G0,...,GC−1G_0, ..., G_{C-1}G0​,...,GC−1​}。 i. 计算各簇质心 x,yx, yx,y 坐标 ii. 按 x,yx,yx,y 升序排序 →→→ 顺序 {H0,...,HC−1H_0, ..., H_{C-1}H0​,...,HC−1​} - 若质心 xxx 相等(∣Δx∣<1e−12|\Delta x| < 1e-12∣Δx∣<1e−12),再比质心 yyy; - 若仍相等,再比簇内最小索引 iii. 最终编号 H0→0,H1→1,...H_0 \to 0, H_1 \to 1, ...H0​→0,H1​→1,...

输入描述

单行JSON

{
 "C": 2,          // 目标簇数 (2 ≤ C ≤ n ≤ 100)
 "points": [[x1, y1],
         [x2, y2]
       ...]                // 原始顺序固定
}
  • 所有坐标为浮点数/整数
  • 无缺失值,无空行

输出描述

  • 单行 JSONJSONJSON 数组,长度 =n= n=n
  • 第 iii 个元素 === 输入中第 iii 个点所属簇编号
  • 例:[0,0,1,1][0, 0, 1, 1][0,0,1,1]

补充说明

  1. 为了确保通过测试用例,仅允许使用 numpy/pandas/scikit−learnnumpy / pandas / scikit-learnnumpy/pandas/scikit−learn。
  2. 若是使用 sklearnsklearnsklearn 库而非 numpynumpynumpy 自定义实现,则调用 sklearn.cluster.AgglomerativeClustering(linkage=′single′)sklearn.cluster.AgglomerativeClustering(linkage='single')sklearn.cluster.AgglomerativeClustering(linkage=′single′),需按照本题映射规则输出。

样例1

输入

{"C":2,"points":[[0,0],[0,1],[10,10],[10,11]]}

输出

[0, 0, 1, 1]

登录后即可使用 AI 分析。

    模式
    倒计时时长
    :

    最长 10 小时 59 分;应用后按此时长重新开始。

    提示:点击提交记录在左侧题面区域查看详情
    题库
    AI分析设置
    留空使用官方API Key,每天有次数限制(自定义API Key仅限会员和管理员使用,不限次数)
    会员和管理员可切换模型;切到 Kimi/智谱/通义/豆包时需填写对应供应商 API Key
    升级会员,可将运行与提交冷却时间缩短至 1 秒起

    Status

    • Judging Queue
    • Service Status

    Development

    • Open Source

    Support

    • Help
    • Contact Us

    About

    • About
    • Privacy
    • Terms of Service
    • Copyright Complaint
    1. Language
      1. English
      2. 한국어
      3. 简体中文
      4. 正體中文
    2. Legacy mode
    3. Theme
      1. Light
      2. Dark
    1. 京ICP备2025123107号-1
    2. Worker 3, 135ms
    3. Powered by Hydro v5.0.0-beta.18 Community

    Don't have an account?

    By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.

    Sign Up Now
    CLOSE

    SIGN IN

    Using your CodeFun2000 universal account

    Login with Wechat
    Forgot password or username?