我们得到了一个数字序列,作为 vector foo。任务是找到foo单调增加-每一项小于或等于下一项-或单调减少-每一项大于或等于下一项。

当然可以通过循环找到它,但是还有更多创意吗?

最佳答案

另一个:检查是否

all(x == cummax(x))

要么
all(x == cummin(x))

分别单调增加或减少。看来cummaxdiff快很多,并且使用的内存更少:
> x <- seq_len(1e7)
> system.time(all(x == cummax(x)))
   user  system elapsed
   0.11    0.00    0.11
> system.time(all(diff(x) >= 0))
   user  system elapsed
   0.47    0.13    0.59

> x <- seq_len(1e8)
> system.time(all(x == cummax(x)))
   user  system elapsed
   1.06    0.09    1.16
> system.time(all(diff(x) >= 0))
Error: cannot allocate vector of size 381.5 Mb
In addition: Warning messages:
1: Reached total allocation of 1535Mb: see help(memory.size)
2: Reached total allocation of 1535Mb: see help(memory.size)
3: Reached total allocation of 1535Mb: see help(memory.size)
4: Reached total allocation of 1535Mb: see help(memory.size)
Timing stopped at: 1.96 0.38 2.33

我之所以押宝cummaxdiff更快的原因是,它只需要比较数字就比计算差更快。

编辑:根据您(Ali的要求)进行其他测试,包括您的答案(请注意,我现在是从其他计算机上运行,​​因此以下结果不应与上述结果进行比较)
> x <- seq_len(1e7)
> system.time(x == cummax(x))
   user  system elapsed
  0.316   0.096   0.416
> system.time(all(diff(x) >= 0))
   user  system elapsed
  4.364   0.240   4.632
> system.time(x[-1] - x[-length(x)] >= 0)
   user  system elapsed
  3.828   0.380   4.227
> system.time(all(x[-1] >= x[-length(x)]))
   user  system elapsed
  2.572   0.288   2.865

关于r - 如何检查数字序列是否单调增加(或减少)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13093912/

10-11 21:56