我们得到了一个数字序列,作为 vector foo
。任务是找到foo
单调增加-每一项小于或等于下一项-或单调减少-每一项大于或等于下一项。
当然可以通过循环找到它,但是还有更多创意吗?
最佳答案
另一个:检查是否
all(x == cummax(x))
要么
all(x == cummin(x))
分别单调增加或减少。看来
cummax
比diff
快很多,并且使用的内存更少:> 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
我之所以押宝
cummax
比diff
更快的原因是,它只需要比较数字就比计算差更快。编辑:根据您(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/