是否有算法在线性时间内计算数组反转?

时间:2014-06-02 17:17:24

标签: c arrays algorithm

我知道 n 元素数组中inversions的数量可以计入O( n 日志( n ))使用enhanced merge sort的操作。

然而,我遇到了一个不同的解决方案,它以某种方式设法计算O( n )时间内的反转次数,前提是输入是(1,2,3, ..., n -1, n ):

编辑: -


我很抱歉我粘贴的代码因为它在所有情况下都不起作用。实际上这个代码用于this question并且它通过了所有案例。但我仍然离开代码,以便它可以作为一些直觉,也许会出现这个问题的线性时间解决方案。

注意: - 以下提到的代码不正确。


/* int in = 0;
    for (int i = 0; i < n; i++) {
        a[i] = a[i] - i - 1;
    }
    for (int i = 0; i < n; i++) {
        if (a[i] > 0)
            in = in + a[i];
        else if (a[i] < -1)
            in = in - a[i] - 1;
    } */ 

现在问题是我们能否为这个问题提出线性时间解决方案?

2 个答案:

答案 0 :(得分:3)

显而易见的答案是它没有。例如,对于n = 4a = {2, 3, 4, 1},您的代码给出答案5,即使正确的反转计数明显为3。

答案 1 :(得分:1)

方法错了! 考虑下面的例子!

int a[] = { 2, 3, 1 };

int in = 0;

for (int i = 0; i < n; i++) {
    a[i] = a[i] - i - 1;
}

// a[] = { 1, 1, -2 };

for (int i = 0; i < n; i++) {
    if (a[i] > 0)
        in = in + a[i];
    else if (a[i] < -1)
        in = in - a[i] - 1;
} 

// in = 1 + 1 - (-1) = 3

正确的答案是2,但它在这里返回3!