2

假设我有以下向量:

vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28)

您会注意到有三个重复元素(25、24 和 28)。如何让 R 识别向量中何时存在重复元素(或循环)?无论有多少元素重复(2 或 5 而不是 3),也无论它开始的向量中有多少元素,我都想检测到这一点。

对于上下文,我有一个算法试图收敛于一个值,但有时它会卡在这个重复循环中。我希望 R 检测到它何时卡在这个无限循环中并退出。在vec我的示例中,是每次迭代的值的日志。

我已经弄清楚如何捕获双重重复元素(保存上次迭代的值以与当前迭代进行比较)但是这 3+ 重复元素让我感到困惑。

4

3 回答 3

1

此函数将查找 2 个重复的模式。我通过将第二个元素乘以“100”并添加到第一个元素来计算元素对的哈希值 [i] 与 [i+1]。您可以将此因子更改为其他数字,假设您的整数受该因子的限制。您可能希望将其更改为 1000000。如果您有大整数,您可能需要重新考虑这一点。

然后我希望确保哈希都是唯一的,即从 [i] 到 [i+1] 的转换只发生一次。

hasCycle <- function(v) {
  hash <- v[1:length(v)-1] + 100 * v[2:length(v)]
  length(unique(hash)) != length(hash)
}

这是我的测试

> a <- c(1, 2,3,4,5,1,6,7)
> hasCycle(a)
[1] FALSE
> 
> b <- c(1, 2,3,4,5,9,7,3,4)
> hasCycle(b)
[1] TRUE
于 2016-12-20T01:19:15.437 回答
0

在运行分析之前,请使用该duplicated()方法。如果返回向量的长度为 0,则没有重复。

于 2016-12-20T00:51:59.267 回答
0

这可以工作:

如果我允许vec运行更长的时间:

vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28)

然后我可以找到长达 10 个元素的循环。可以通过更改来合并更长的周期,10但我希望永远不必处理这个问题!

any(sapply(1:10, function(i) all(tail(diff(vec, lag = i), 10) == 0)))
于 2016-12-20T01:03:19.853 回答