Algorithm 空间聚类算法

Algorithm 空间聚类算法,algorithm,cluster-analysis,Algorithm,Cluster Analysis,给定一个二维平面上的点集合,我想找到彼此在Y范围内的X点集合。例如: 8| 7| a b 6| 5| c 4| 3| e 2| d 1| ------------------------- 1 2 3 4 5 6 7 8 9 0 1 a、b、c和d是二维平面上的点。给定3个参数表示点数(X),3个参数表示距离(Y),算法将返回[[a,b,c]]。一些例子: algorith

给定一个二维平面上的点集合,我想找到彼此在
Y
范围内的
X
点集合。例如:

8|
7|    a     b
6|
5|       c
4|
3|                    e
2|                  d          
1|
-------------------------
  1 2 3 4 5 6 7 8 9 0 1
a
b
c
d
是二维平面上的点。给定3个参数表示点数(
X
),3个参数表示距离(
Y
),算法将返回
[[a,b,c]]
。一些例子:

algorithm(X = 3, Y = 3) returns [[a, b, c]]
algorithm(X = 2, Y = 3) returns [[a, b, c], [d, e]] -- [a, b, c] contains at least two points
algorithm(X = 4, Y = 3) returns [] -- no group of 4 points close enough
algorithm(X = 5, Y = 15) returns [[a, b, c, d, e]]
限制条件:

  • x轴和y轴(上面的数字)都有10000个单位长
  • 图上有800个点(a、b、c、d等)
  • 我认为这无关紧要,但我正在使用JavaScript

我尝试过的事情:

  • 实际上,我关心的是输出接近多个输入点的新点,所以我尝试在网格上迭代,并使用毕达哥拉斯“环顾”它,以找到给定距离之外的每个点。考虑到总面积,这太慢了。 您还可以在中看到数据大小
  • ,这似乎有一个不同的目的-我知道我希望我的集群大小有多大
  • 我试着相互比较点,建立紧密配对,然后紧密三胞胎,等等,直到最后,但这似乎也有点效率低下。我将继续尝试一些散列或字典来避免这些循环

只有800个点,你可以通过比较每一对来构建图表,然后运行以找到最大的派系。这里有一个合法的Javascript算法实现:

顺便说一句,这不是家庭作业-我带着两个孩子搬到了一个国家,让他们上学是一场噩梦,等待名单是基于直线距离的。你可以把它变成一个图问题。创建一个完整的图形,其中边的权重为距离。现在,对于每个节点,检查所有
n-1
相邻边的权重,并查看其中
X
的权重是否小于或等于
Y
。第一次构建它将是
O(N^2)
,但是在那之后,所有的查询都将是
O(N)
@mitchelpulin,谢谢。感觉这是我第二次尝试的方向,但我不确定。你能给我指一个教程或一些搜索词吗?我以前从来没有做过这样的事情。我想你应该先看看图形数据结构“算法(X=2,Y=3)返回[[a,b,c],[d,e]]”第一个集合有三个点,而不是2。这很有希望,谢谢。当我看到它使用我的约束执行时,我会将其标记为已接受。@sennett如果它不够快,您可以尝试以足够快的速度将图形转换为其k=X-1核心(迭代删除次数小于X-1的顶点;请参见)。谢谢