当该算法创建的组中没有更多更改时,如何停止该算法

问题描述

我正在尝试寻找一种替代算法,将直接或间接连接的列表中的向量分组-通过“ connected”,我的意思是拥有一个非空的交集。

此过程应该是有效的,因为它可以花很短的向量(大约10个向量,每个向量最多5个条目)在可能成千上万个列表上运行就不会花费太长时间。 在这个问题中,我还有一个使用igraph 的解决方案:How to merge two different groupings if they are not disjoint with dplyr

但是,我的代码花了太长时间才能运行它。

以下是在纸上尝试一些示例后我转向的示例:

vectors <- list(1:3,3:4,4:5,6)

最终输出应将前三个元素组合在一起,最后一个分开。 vectors[[1]]通过拥有2和3共同连接到vectors[[2]]。从vectors[[2]]vectors[[3]],因为4。vectors[[1]]vectors[[3]]之所以合并,是因为它们具有公共交点。这应该概括为“更长的链”。

因此,我试图编写自己的函数来迭代如下所示的过程:

1-在vectors[[i]]中的unlist(vectors)中找到最常见的条目,并取它们的最小值(如果我们采用多模式情况):

 modes <- function(x,y) {
      ux <- unique(x)
      tab <- tabulate(match(y,ux))
      ux[tab == max(tab)]
    }

      z <- map(vectors,~ modes(.,unlist(vectors)) %>%
                 map(.,min))

此步骤应产生:z <- list(3,4,6)。创建vectors2,它接受​​vectors[[i]]并具有相同z[[i]]的{​​{1}}的并集。

再次重复上一步:

vectors2 <- list(1:3,3:5,6)

这样z2 <- map(vectors2,unlist(vectors2)) %>% map(.,min)) z2 <- list(3,3,6)

由于如果要重复执行该算法,则不会发生任何变化,因此该过程将停止并返回vectors3 <- list(1:5,1:5,6)

说了这么多,我想知道如何在z2中实现一些上述步骤:

  • 如何通过合并上一步中具有相同R的条目来形成vectors2vectors3等。
  • 如何为算法设置停止时间-可能是硬停止(在n次迭代后停止),或者在z s收敛后停止。

最后,我问这种算法是否可能比链接的解决方案更有效。

如果这种解释不清楚,请在数学交换中的一个链接中要求我提供算法证明:https://math.stackexchange.com/questions/3854566/how-would-one-prove-that-this-algorithm-to-find-connected-dots-works-and-converg

也许这是很多问题,但是我很感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...