我正在尝试用 C++ 编写一个有效的排名算法,但我将在 R 中展示我的案例,因为这样更容易理解。
> samples_x <- c(4, 10, 9, 2, NA, 3, 7, 1, NA, 8)
> samples_y <- c(5, 7, 9, NA, 1, 4, NA, 8, 2, 10)
> orders_x <- order(samples_x)
> orders_y <- order(samples_y)
> cbind(samples_x, orders_x, samples_y, orders_y)
samples_x orders_x samples_y orders_y
[1,] 4 8 5 5
[2,] 10 4 7 9
[3,] 9 6 9 6
[4,] 2 1 NA 1
[5,] NA 7 1 2
[6,] 3 10 4 8
[7,] 7 3 NA 3
[8,] 1 2 8 10
[9,] NA 5 2 4
[10,] 8 9 10 7
假设上述内容已经预先计算。对每个样本集执行简单的排序需要线性时间复杂度(结果很像rank
函数):
> ranks_x <- rep(0, length(samples_x))
> for (i in 1:length(samples_x)) ranks_x[orders_x[i]] <- i
对于我正在从事的工作项目,在线性时间复杂度中模拟以下行为对我很有用:
> cc <- complete.cases(samples_x, samples_y)
> ranks_x <- rank(samples_x[cc])
> ranks_y <- rank(samples_y[cc])
当给定 n 个相同长度的集合时,该complete.cases
函数返回没有任何集合包含 NA 的索引。该order
函数返回与已排序样本集对应的索引的排列。该rank
函数返回样本集的等级。
这个怎么做?如果我提供了有关问题的足够信息,请告诉我。
更具体地说,我正在尝试基于 Spearman 的秩和相关系数测试构建一个相关矩阵,以便正确处理 NA。NA 的存在要求对每个成对样本集 ( s n^2 log n
) 计算排名;我试图通过为每个样本集 ( s n log n
) 计算一次订单并为每个成对比较使用线性复杂度来避免这种情况。这甚至可行吗?
提前致谢。