计算反转对


14

分而治之的经典应用是解决以下问题:

给定不同的可比较元素的数组,计算数组中的反转对的数量:对,使得和。a[1n](i,j)a[i]>a[j]i<j

一种解决方法是进行合并排序,但还要计算子问题中反转对的数量。在合并步骤中,我们计算跨越(两个)子问题的反转对的数量,并将其添加到子问题的计数中。

虽然这很好,并且给出了时间算法,但是却弄乱了数组。O(nlogn)

如果我们还有其他限制,即数组是只读的,则可以制作一个副本并处理该副本,或者使用其他数据结构(例如订单统计平衡二叉树)进行计数,两者都使用空间。Θ(n)

当前的问题是在不影响运行时间的情况下尝试改善空间。即

是否存在时间算法来计算反转对的数量,该算法适用于只读数组并使用亚线性(即)空间?O(nlogno(n)

假设一个成本均一的RAM模型,并且元素占用空间,并且它们之间的比较为。O(1)O(1)

参考会做,但是一个解释会更好:-)

我尝试在网上搜索,但找不到任何肯定/否定答案。我想这只是出于好奇。


3
Chan和Pătraşcu给出了一个时间算法,但据我从略读中可以看出,它们需要Ω n 空间。o(nlogn)Ω(n)
拉斐尔

2
此外,Ajtai等。证明任何(精确的)时间流算法都需要Ω n 空间。不过,似乎有些近似符合您的标准。O(n)Ω(n)
拉斐尔

1
@Raphael:谢谢!如果没有答案,那么您的评论将是迄今为止最好的答案。
Aryabhata

顺便说一句,我对Ajtai等人的下界有些困惑。定理8说“任何算法”,但是我的下限似乎反对单次精确流算法,这是一个非常受限制的模型
Sasho Nikolov 2012年

@SashoNikolov:我认为他们在全球范围内将模型设置为流算法,因此“ any”将仅限于这些算法。我希望我的推论-任何精确的时间算法-是正确的,也就是说,任何线性时间算法都可以表示为具有多次遍历的流式算法。我们会看到的O(n)
拉斐尔

Answers:


3

这是拉斐尔的答案:

o(nlogn)Ω(n)O(n)Ω(n)


感谢您做出答复。我会再给它一些时间。流量似乎正在增加。
Aryabhata 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.