计算 nlogn 中的反转

Posted

技术标签:

【中文标题】计算 nlogn 中的反转【英文标题】:Count inversions in nlogn 【发布时间】:2016-10-23 12:02:30 【问题描述】:

考虑一个数组'a'。如果 a[i] > a[j] 和 i

例如,给定

int a[5] = 2, 3, 8, 6, 1

这有 5 个“逆”:

(8,6) (2,1) (3,1) (8,1) (6,1)

我的任务是编写一个 C++ 程序来计算数组中“逆”对的数量,运行时间缩放为 O(n logn)

我的代码的运行时间为 O(n²):

int nghichdao(int a[], int n)

    int d = 0;
    for (int j = 1;j < n;j++)
        for (int i = 0;i < j;i++)
            if (a[i] > a[j]) 
                d++;
                cout << "(" << a[i] << "," << a[j] << ")" << endl;
            
    return d;

如何将其改进为 O(n logn)?

【问题讨论】:

您已经尝试过什么了吗?询问“有什么想法吗?” 听起来太宽泛,无法在此提出。这可能会变成无休止的讨论,这是我们不想要的。该网站是关于简洁的常见问题解答,例如问答对。您可能还想阅读here。 对不起,因为这是我第一次问。我已经写了代码,但运行时间是 O(n^2) 提示:如果你不迭代那些i &lt; j 为假的索引,那么你会得到n * log n 【参考方案1】:

使用合并排序以 N*logN 实现倒数。参考这个http://www.geeksforgeeks.org/counting-inversions/

【讨论】:

以上是关于计算 nlogn 中的反转的主要内容,如果未能解决你的问题,请参考以下文章

计算变化数组中的预期反转次数[关闭]

如何使用合并排序为Scala中的Int列表计算反转计数?

我无法在合并排序中使用java获得反转次数

轻松了解Spring中的控制反转和依赖注入

轻松了解Spring中的控制反转和依赖注入

合并排序python中的反转数