1684: 密度聚类(DBSCAN)

内存限制:128 MB 时间限制:1 S
题面:传统 评测方式:文本比较 上传者:
提交:2 通过:2

题目描述

DBSCAN(Density-based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,能发现任意形状的聚类,并标记噪声点。现要求你实现标准 DBSCAN 算法,具体规则如下:
  1. ε 邻域:对于样本点p,其 ε 邻域定义为所有与p的欧几里得距离≤ε的样本点集合(包含p自身)。
  2. 核心点:若样本点p的 ε 邻域内的样本点数≥MinPts,则p为核心点;否则为非核心点。
  3. 直接密度可达:若样本点q在核心点p的 ε 邻域内,则称qp直接密度可达。
  4. 密度可达:若存在样本点序列p1,p2,...,pn,其中p1=ppn=q,且pi+1pi直接密度可达,则称qp密度可达。
  5. 密度连通:若存在样本点o,使得pq都从o密度可达,则称pq密度连通。
  6. 聚类定义:一个聚类是最大的密度连通样本点集合;不属于任何聚类的样本点为噪声点(标记为 - 1)。
  7. 聚类编号规则:按核心点被首次发现的顺序分配聚类编号(从 0 开始),非核心点若与核心点密度连通则归入对应聚类。
请你实现该算法,并输出每个样本点的聚类编号(按输入顺序输出)。

输入格式

第一行包含 4 个参数:
  • n:样本点数量(1n104
  • d:样本点的维度(1d5
  • ε:邻域半径(0<ε104,浮点数)
  • MinPts:核心点的最小邻域点数(2MinPts100
接下来n行,每行包含d个浮点数,表示一个d维样本点(每个数值范围[104,104])。

输出格式

输出n行,每行一个整数,表示对应样本点的聚类编号(噪声点输出 - 1)。

样例输入

8 2 1.5 3
1.0 1.0
1.5 1.0
1.0 1.5
2.0 5.0
8.0 8.0
8.5 8.0
8.0 8.5
10.0 10.0

		

样例输出

plaintext
0
0
0
-1
1
1
1
-1

样例解释

  • 前 3 个点的 ε 邻域(1.5)内互相包含,点数≥3,构成核心点,归为聚类 0;
  • 第 4 个点的 ε 邻域内只有自身,为噪声点;
  • 第 5-7 个点的 ε 邻域内互相包含,点数≥3,构成核心点,归为聚类 1;
  • 第 8 个点的 ε 邻域内只有自身,为噪声点。

数据范围

  • 1n1041d50<ε104
  • 2MinPts100
  • 所有浮点数精度保证在106以内

输入样例 复制

8 2 1.5 3
1.0 1.0
1.5 1.0
1.0 1.5
2.0 5.0
8.0 8.0
8.5 8.0
8.0 8.5
10.0 10.0

输出样例 复制

0
0
0
-1
1
1
1
-1

分类标签