如何有效地找到数组中每个元素的排名,在平局的情况下进行平均?例如:
float[] rank(T)(T[] input) {
// Implementation
}
auto foo = rank([3,6,4,2,2]); // foo == [3, 5, 4, 1.5, 1.5]
我能想到的唯一方法需要分配3个数组:
- 输入数组的副本,因为它必须排序并且我们不拥有它。
- 一个数组,用于跟踪输入数组的排序顺序。
- 要返回的秩数组。
有谁知道如何在 O(N log N) 时间和 O(1) 辅助空间中执行此操作(这意味着我们必须分配的唯一数组是我们要返回的数组),或者至少摆脱其中一个上面的三个数组?