Algorithm 是否有一种算法来确定相邻区域中的元素数量?

Algorithm 是否有一种算法来确定相邻区域中的元素数量?,algorithm,Algorithm,我有一组放置在二维欧几里德空间中的点。如果两点之间的距离小于预定的截止半径,则将其视为相邻点。我想计算相邻区域中元素的数量,例如,假设1和2是邻居。如果2和3也是邻居,3和4也是邻居,那么我们有4个元素彼此相邻 我在谷歌上搜索了一整天,遇到了很多关键词,比如kd-tree,k-means-clustering,graph-traversal,flood-fill和connected-component-analysis,但我现在还不能完全了解它们。我只是需要一些方向来把我的努力集中在正确的方向上

我有一组放置在二维欧几里德空间中的点。如果两点之间的距离小于预定的截止半径,则将其视为相邻点。我想计算相邻区域中元素的数量,例如,假设1和2是邻居。如果2和3也是邻居,3和4也是邻居,那么我们有4个元素彼此相邻


我在谷歌上搜索了一整天,遇到了很多关键词,比如kd-tree,k-means-clustering,graph-traversal,flood-fill和connected-component-analysis,但我现在还不能完全了解它们。我只是需要一些方向来把我的努力集中在正确的方向上

这显然是一个图论问题。有一个图,其节点由点组成,其中两个节点通过一条边连接,若它们的距离在给定的阈值内。您正在查找各种连接组件的大小。宽度优先搜索是枚举此类组件的首选方法,但如果节点数量足够小,则可以在相应的邻接矩阵上使用Warshall算法

这显然是一个图论问题。有一个图,其节点由点组成,其中两个节点通过一条边连接,若它们的距离在给定的阈值内。您正在查找各种连接组件的大小。宽度优先搜索是枚举此类组件的首选方法,但如果节点数量足够小,则可以在相应的邻接矩阵上使用Warshall算法

你的问题好像是在分析

第一件事是将您的数据表示为一个图形,有大量的库用于此。让我们举一个Python的例子:你可以使用。这很简单,因为点可以表示为节点。关于边,基本上有几种解决方案

您可以进行蛮力比较,将所有点相互比较。它将在*n-1/2上运行,如果数据集很小,则正常。如果数据集很大,可以使用不同的近似算法KD-tree、ball-tree,这些算法在或中实现。请注意,scikit learn还提供了蛮力比较

这里的目标是,如果距离低于阈值,则在两个节点点之间创建一条边作为链接

在图形中添加节点和边后,可以运行连接组件算法,该算法将提供图形的所有连接组件。连接的组件基本上是一组由边连接的连续节点

请注意,一旦你的问题被表示为一个图,几乎70年的图论就可以解决了。您可以使用以下命令检查某些区域是否与其他区域具有相同的形状。可以使用检查每个组件中每个点的重要性。您还可以将连续对象划分为子区域,而无需使用设置阈值来设置边

您可以在我的桌面上看到一个连续图切割成多个分区的实例

为了论证:这里是一个例子,几个连接的组件属于同一个图,具有自边

你的问题看起来像是一个分析

第一件事是将您的数据表示为一个图形,有大量的库用于此。让我们举一个Python的例子:你可以使用。这很简单,因为点可以表示为节点。关于边,基本上有几种解决方案

您可以进行蛮力比较,将所有点相互比较。它将在*n-1/2上运行,如果数据集很小,则正常。如果数据集很大,可以使用不同的近似算法KD-tree、ball-tree,这些算法在或中实现。请注意,scikit learn还提供了蛮力比较

这里的目标是,如果距离低于阈值,则在两个节点点之间创建一条边作为链接

在图形中添加节点和边后,可以运行连接组件算法,该算法将提供图形的所有连接组件。连接的组件基本上是一组由边连接的连续节点

请注意,一旦你的问题被表示为一个图,几乎70年的图论就可以解决了。您可以使用以下命令检查某些区域是否与其他区域具有相同的形状。可以使用检查每个组件中每个点的重要性。您还可以将连续对象划分为子区域,而无需使用设置阈值来设置边

您可以在我的桌面上看到一个连续图切割成多个分区的实例

为了论证:这里是一个例子,几个连接的组件属于同一个图,具有自边


你所描述的听起来像是算法。我会查看链接以获取描述。这将需要您定义到邻居的距离和最小值 最小需要的邻居数


此外,DBSCAN算法相当于查找图的连接组件,其中,如果某个节点具有最少数量的邻居,则该图由一定距离内的节点连接而成。您可以使用算法解决图形连接组件问题。

您所描述的内容听起来像是算法。我会查看链接以获取描述。这将需要您定义到邻居的距离以及所需的最小邻居数


此外,DBSCAN算法相当于查找图的连接组件,其中,如果某个节点具有最少数量的邻居,则该图由一定距离内的节点连接而成。您可以使用算法解决图形连接组件问题。

如果点的数量较少,只需在所有点对上循环,测试它们的距离,如果距离小于阈值,则在数据结构中关联这两个点

为了加快速度,您可以对点进行初始传递,将点划分为多个桶,每个桶的高度和宽度等于阈值;然后,对于每个点,您不需要将其与每个其他点进行比较,只需将桶周围3x3邻域中的每个其他点进行比较即可


如果将点划分为大小为threshold*sqrt2/2的桶,则可能会进一步加快速度,同一个桶中的所有点都必须关联,不需要进行明确的距离检查,尽管对于那些较小的桶,您必须检查较大的5x5周围邻居是否有足够近的点。

如果点的数量较少,只需在所有点对上循环,测试它们的距离,如果距离小于阈值,则将数据结构中的这两个点关联起来

为了加快速度,您可以对点进行初始传递,将点划分为多个桶,每个桶的高度和宽度等于阈值;然后,对于每个点,您不需要将其与每个其他点进行比较,只需将桶周围3x3邻域中的每个其他点进行比较即可


如果将点划分为大小为threshold*sqrt2/2的桶,则可能会进一步加快速度,同一个桶中的所有点都必须关联,不需要进行明确的距离检查,尽管对于那些较小的桶,您必须检查较大的5x5周围邻居是否有足够近的点。

举个例子会有所帮助。这是一个复杂的问题,你必须学习这些概念才能解决它。我们不会帮助那些自己没有付出足够努力的人。问题意味着截止点在一次跑步中是固定的,但在一次跑步到下一次跑步时它是固定的吗?你如何定义连续区域,因为根据你目前的定义,这种关系不一定是可传递的。你想要最大的一组点,所有的点都适合一个半径为r,圆心未知的圆吗?点的数量大吗?有一个简单、朴素的^2解决方案,可以用于少量点数。举个例子会有所帮助。这是一个复杂的问题,你必须学习这些概念才能解决它。我们不会帮助那些自己没有付出足够努力的人。问题意味着截止点在一次跑步中是固定的,但在一次跑步到下一次跑步时它是固定的吗?你如何定义连续区域,因为根据你目前的定义,这种关系不一定是可传递的。你想要最大的一组点,所有的点都适合一个半径为r,圆心未知的圆吗?点的数量大吗?在^2上有一个简单、朴素的解决方案,它适用于少量的点。我认为,{a,b}是邻居,{b,c}是邻居这一事实表明,{a,c}是邻居是不正确的。即使OP提到了关联,这种关系也不一定是关联的。让我们看看他对评论的反应。这其实没什么关系。两条边之间的公共节点是B,它仍然会形成一个连续的连接组件。如果我们有边a-B和B-c,在上述情况下,a和c之间的关系是什么?啊,对不起,我误解了你的解决方案,因为你提到了连接组件方法。我不知道你正在进行^2暴力搜索。我认为,{a,b}是邻居,{b,c}是邻居这一事实表明,{a,c}是邻居是不正确的。即使OP提到了关联,这种关系也不一定是关联的。让我们看看他对评论的反应。这其实没什么关系。两条边之间的公共节点是B,它仍然会形成一个连续的连接组件。如果我们有边a-B和B-c,在上述情况下,a和c之间的关系是什么?啊,对不起,我误解了你的解决方案,因为你提到了连接组件方法。我不知道您正在进行^2暴力搜索。