核心思路:密度相连只允许从核心点迈向其 ε-邻域。欧氏距离对称,因此两个核心点只要互相落在邻域内就可以双向走。先找出所有核心点,再在核心点之间按邻域关系做并查集,每个核心连通块覆盖「块内所有核心点的邻域并」。两点密度相连当且仅当它们共同出现在某一块的覆盖集合里。噪声点不属于任何覆盖,与任何点(含自身)都不相连。边界点可同时落入多块覆盖,询问时取集合交集即可。
实现方法:用平方距离判断邻域,避免开方。N≤1000,两两枚举即可。核心点并查集之后,把每个核心的邻域点记到该块的覆盖里,再回答 M 组询问。
时间复杂度:O(N2+M)。邻域枚举 O(N2),并查集与覆盖收集 O(N2α(N)),询问按所属块数量均摊不超过 O(N+M)。
文档检索系统需要判断片段是否相关。本题将每个文档片段视为平面上的一个点。为提高检索效率,要判定两个片段是否属于同一语义簇:若它们密度相连,则认为语义相近。
给定一组点,以及两个参数:邻域半径 ε、最小点数 MinPts。
几个直接推论:
第一行四个数:N、M、ε、MinPts
接下来 N 行:每行两个浮点数 xi、yi,按顺序给出编号为 0 到 N−1 的点的坐标。
接下来 M 行:每行两个整数 a、b,询问点 a 与点 b 是否密度相连。
共 M 行,每行一个整数:
提示:可按密度聚类 / 密度可达来做判定。
输入
6 4 2.0 3
0.0 0.0
1.2 0.0
0.4 1.0
12.0 0.0
12.5 0.4
6.0 6.0
0 2
0 3
3 4
1 5
输出
1
0
0
0
说明
ε=2.0,MinPts=3。
点 0,1,2 两两距离分别为 1.2、1.16≈1.077、1.64≈1.281,均不超过 2.0,每个点的邻域大小都是 3,因此都是核心点,彼此密度相连。
点 3 与点 4 相距 0.41≈0.640≤2.0,但各自邻域只有 2 个点,不是核心点,也没有核心点能走到它们,因此是噪声点,彼此不密度相连。
点 5 邻域只有自身,同样是噪声点。
输入
8 4 2.0 3
0.0 0.0
1.5 0.0
0.3 1.4
3.2 0.2
8.0 8.0
8.6 8.2
8.3 9.5
0.0 8.0
0 2
0 3
4 5
3 4
输出
1
1
1
0
说明
ε=2.0,MinPts=3。
点 0,1,2 两两距离分别为 1.5、2.05≈1.432、3.4≈1.844,均为核心点。点 3 到点 1 的距离为 2.93≈1.712,落入点 1 的邻域,但自身邻域只有 2 个点,是边界点;从核心点 1 可以走到点 0 与点 3,故 0 与 3 密度相连。
点 4,5,6 两两距离分别为 0.4≈0.632、2.34≈1.529、1.78≈1.334,都是核心点,形成一个独立的簇。
点 3 与点 4 分属不同簇,不密度相连。点 7 是噪声点。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册