【发布时间】:2014-05-21 11:37:09
【问题描述】:
假设我们有几个向量
a <- c(1, 2, 2, 4, 7)
b <- c(1, 2, 3, 5, 7)
对于b 中的每个元素b[i],我想找到a 中小于b[i] 的元素数量,或者,等价的,我想知道c(b[i], a) 中b_i 的等级。
我能想到几种幼稚的方法,例如执行以下任一length(b) 次:
min_rank(c(b[i], a))
sum(a < b[i])
如果length(a) = length(b) = N 其中 N 很大,那么最好的方法是什么?
编辑:
为了澄清,我想知道是否有一种计算效率更高的方法来做到这一点,即在这种情况下我是否可以做得比二次时间更好。
不过,矢量化总是很酷;),谢谢@Henrik!
运行时间
a <- rpois(100000, 20)
b <- rpois(100000, 10)
system.time(
result1 <- sapply(b, function(x) sum(a < x))
)
# user system elapsed
# 71.15 0.00 71.16
sw <- proc.time()
bu <- sort(unique(b))
ab <- sort(c(a, bu))
ind <- match(bu, ab)
nbelow <- ind - 1:length(bu)
result2 <- sapply(b, function(x) nbelow[match(x, bu)])
proc.time() - sw
# user system elapsed
# 0.46 0.00 0.48
sw <- proc.time()
a1 <- sort(a)
result3 <- findInterval(b - sqrt(.Machine$double.eps), a1)
proc.time() - sw
# user system elapsed
# 0.00 0.00 0.03
identical(result1, result2) && identical(result2, result3)
# [1] TRUE
【问题讨论】:
-
+1 用于提供一个小型、易于重现的玩具数据集,以及您尝试过的代码。为了让希望帮助您检查他们的代码是否产生正确结果的人更容易,请同时发布您想要的输出。干杯。
标签: r sorting vector time-complexity ranking