如何解决当该算法创建的组中没有更多更改时,如何停止该算法
我正在尝试寻找一种替代算法,将直接或间接连接的列表中的向量分组-通过“ 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
的条目来形成vectors2
,vectors3
等。 - 如何为算法设置停止时间-可能是硬停止(在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 举报,一经查实,本站将立刻删除。