【问题标题】:Count inversions in nlogn计算 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

标签: c++ algorithm time-complexity


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多