线性时间中的“几乎排序”整数


16

我有兴趣对线性时间中的正整数值的数组进行排序(在采用均等成本度量的RAM模型中,即整数可以具有对数大小,但假定对其进行算术运算单位时间)。当然,使用基于比较的排序算法是不可能的,因此我对计算“近似”排序很感兴趣,即,计算一些置换通常不是真正排序的,而是的排序版本的“良好近似” 。我将假定我们按递减顺序对整数进行排序,因为它使续集的陈述更加令人愉快,但当然可以反过来说明问题。L=v1,,vnvσ(1),,vσ(n)LL

用于近似的排序的一个可能的准则是以下的(*):让Nivi,对于每1in,我们要求(即, “准排序”列表从上方受递减函数。很容易看出实际排序满足以下条件:不得大于因此最多为,即,通常不得大于vσ(i)N/iiN/ivσ(2)vσ(1)(vσ(1)+vσ(2))/2N/2vσ(i)(jivσ(i))/i,即。N/i

例如,可以通过以下算法(@Louis建议)来实现要求(*)。我的问题是:是否通过强加诸如(*)这样的实际排序可以满足的要求来完成线性时间“几乎排序”整数的任务?下面的算法或它的某些变体是否具有确定的名称?

编辑:修复了算法并添加了更多说明


算法:

INPUT: V an array of size n containing positive integers
OUTPUT: T

N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+

For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+

由于以下原因,此算法按预期工作:

  1. 如果元素在存储桶则。 vjvN/j

    v放入存储桶,因此j≤\ lfloor N / v \ rfloor≤N / vj=min(N/v,n)jN/vN/v

  2. 如果元素在存储桶则或。 vjN/(j+1)<vj=n

    vĴ = 分钟Ñ / v Ñ Ĵ = ñ / v Ĵ = Ñ Ĵ = ñ / v Ĵ ñ / v < Ĵ + 1 ñ /Ĵ + 1 < v放入存储桶,因此或。在第一种情况下,,这意味着,因此。j=min(N/v,n)j=N/vj=nj=N/vjN/v<j+1N/(j+1)<v

  3. 对于,存储桶中从1到最多有元素。j<njj

    令,令为桶1..j之一中元素的总数。通过2.我们有每个元素在水桶(与)是这样的,。因此,存储桶中从到的所有元素的总和大于。但是这个和也小于因此,因此 ,这使我们或。j<nkviijN/(j+1)N/(i+1)<vK1jk×N/(J+1)KNk×N/(j+1)<KNk/(j+1)<1k<j+1kj

  4. T满足(*)即的个元素使得jTT[j]N/j

    3.我们有,所述的个元素,来自铲斗与因此。T[j]jTiijT[j]N/iN/j

  5. 该算法需要线性时间。

    的计算需要线性时间。可以使用具有插入和迭代的链表来实现存储桶。嵌套循环运行的次数与元素的运行次数相同(即次)。NO(1)n


1
不忽略这个问题(+1,这是一个很好的问题),但是基数排序是否会超出您的需求?
user541686 '17

@Mehrdad:感谢您的评论!基数排序将对整数进行排序,但是将花费时间O(nlog(maxivi))
a3nm

您能评论一下那个时间复杂性到底是什么不希望的吗?例如,您是否有一个非常大的整数而其他所有东西都很小?
user541686 '17

1
@ a3nm基数排序不是O(n log n),而是O(n),因此如果整数的大小是固定的(例如32位数字或64位数字),则为线性。您排序的数字大小是否可变?
Xavier Combelle'4

1
@XavierCombelle:是的,我在RAM模型中工作,我不能假设输入整数受常数限制。
a3nm

Answers:


8

这听起来很像ASort算法。参见Giesen等的这篇文章。等:

https://www.inf.ethz.ch/personal/smilos/asort3.pdf

不幸的是,运行时间不是很线性。上面的文章证明,在n 2 / ν n 内对n项进行排名的任何基于比较的随机算法都具有n l o g ν n 的下限(假设ν n < n)。nn2/ν(n)nlog(ν(n))ν(n)<n


编辑,以回答问题中的澄清:

您正在执行的操作只是一个存储桶排序。但是,在这种情况下,存储桶排序算法不是线性的。问题是:您必须对自然数求和,然后对它们中的每一个进行除法。由于数字的大小不受限制,因此不再是恒定时间的运算。执行更多的数字求和将需要更长的时间。N/V[i]

要多久 除法取决于位数,所以它是乘以n除法运算。这听起来很熟悉。:)lg(n)n


1
感谢您为我们指出这篇文章!确实,这与问题有点相关。但是,我的算法(既不是原始版本也不是稍有不同的修订版本)与ASort;不太相似。首先,我相信我的算法在运行,而不是像ASort这样在超线性时间内运行。其次,标准(*)与估算Spearman的尺距有很大不同。例如,标准(*)取决于整数的值或多或少是严格的,这与页脚距离不同。第三,尽管我们的算法和ASort都是存储元素,但条件却大不相同。O(n)
a3nm

@ a3nm对上面发布的内容的澄清表明您使用的是存储桶排序,它是线性的(不是基于比较的,这意味着要相互测试两个项目)。问题在于它不适用于所有数学整数。仅当整数大小有界时才有效。
Trixie Wolf,

当您说“仅在整数大小有界时才有效”时,我认为只有在对整数进行实际排序时,这才是正确的。但总的来说,我发布的算法实际上并没有对它们进行排序,它仅执行较弱的条件(*)。因此,即使整数大小不受限制,我也确实认为它可以线性运行。
a3nm

2
@ a3nm不是线性的。请参阅上面的扩展响应。
Trixie Wolf

感谢您的回答,对于延迟,我们深表歉意。我认为该模型有些混乱。我正在用统一的时间量度在RAM模型中工作(如van Emde Boas,《计算机模型和仿真》,《计算手册》中所述):因此,我操纵的数字可以具有对数大小,但是对这些数字的算术运算具有单位成本。我已经相应地编辑了我的问题。我认为,在该模型中,我提出的算法实际上是在线性时间内运行的(但是,在该模型中,当然仍然适用基于比较的实际排序的下限)。nlogn
a3nm

2

事实证明,我的问题毕竟是无关紧要的。确实,我正在用统一的成本度量方法在RAM机器上工作(即,我们有一些寄存器,这些寄存器的大小不必一定是恒定的,但最多可以在输入中存储对数大小的整数,并且这些寄存器上的操作需要一定的时间,包括至少要加上)。实际上,在此模型中,可以在线性时间内完成对整数的排序(实质上是通过执行基数排序)。Grandjean在1996年的论文《排序,线性时间和可满足性问题》中对此进行了解释。

(这并不能回答我关于是否存在对一组整数进行“几乎排序”的充分研究的问题,但要使它们有趣,可能需要这些较弱的概念来更容易实施,即对较弱的概念进行工作。模型或以某种方式在亚线性时间运行。但是,我目前尚不了解这种情况。)

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.