繁体   English   中英

计算倒数以查看数组是否部分排序

[英]Counting inversions to see if an array is partially sorted

下面对排序数组的定义来自Robert Sedgewick和Kevin Wayne的Algorithmbook。

如果反转数小于等于cN,则对数组进行部分排序

c应该有多高应该没有限制吗? 从技术上讲,我不能使c = 1000000000,而现在许多未排序的数组在不应该被视为部分排序的情况下会被算作部分排序的吗? 我知道设置一个高的c值并不明智,但是不应该在某种范围内吗?

这是最坏情况的一个例子。

D C B A

倒数

1(d,c)

2(d,b)

3(d,a)

4(c,b)

5(c,a)

6(b,a)

对于大小为4、6的数组。 如果c = 2和6 <4 * 2,那是完全线性的

我们什么时候达到N ^ 2范围?

反转在一个随机排列的预期数量为〜N 2/4(参见这个问题 ,例如)。

塞奇威克(Sedgewick)的书处理的是渐进复杂性,其思想是“事情开始按照规定的大尺寸行事”。 因此,即使从您的问题中获取较大的c值,对于足够大的n值, c << n / 4

但是然后你问小阵列呢。 问题是,您可以询问该字段的任何部分,而不仅仅是排列。 例如,基于比较的排序是Ω(n log(n)) ,并且说对于某些特定的实现,它正好是30 n log(n)+ 400 但是,对于n足够小的值,* 30 n log(n)+ 400 <5000000000000000000 * n *,因此您可以说排序对于足够小的数组(常数为5000000000000000000)是线性的。 的确如此,但是该领域的大多数人并不认为它非常有用。 (这可能是由于随着时间的推移,CS处理越来越大的尺寸这一事实。)

好吧,从技术上讲, c会有一个上限,因为您只能有这么多的反转(即N(N-1)/2 )。

该算法适用于N并且c不是N的函数,而是一个常数。 您需要根据需要确定c 即使对于某些N值,它的数量级为N^2 ,它仍然是一个常数,对于更高的值,它不能与N^2相比。 因此,通常没有办法限制c

每当您有冲动将c提高到特定N值的提议N^2阶的冲动时,请执行此操作。 然后保持c固定并将N增加几个数量级。 然后享受将常量称为常量的奢侈,无论常量有多大。

更新

将最大反型输入为N(N+1)/2而不是N(N-1)/2 立即修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM