计算 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 < j
为假的索引,那么你会得到n * log n
。
【参考方案1】:
使用合并排序以 N*logN 实现倒数。参考这个http://www.geeksforgeeks.org/counting-inversions/
【讨论】:
以上是关于计算 nlogn 中的反转的主要内容,如果未能解决你的问题,请参考以下文章