我有兴趣对线性时间中的正整数值的数组进行排序(在采用均等成本度量的RAM模型中,即整数可以具有对数大小,但假定对其进行算术运算单位时间)。当然,使用基于比较的排序算法是不可能的,因此我对计算“近似”排序很感兴趣,即,计算一些置换通常不是真正排序的,而是的排序版本的“良好近似” 。我将假定我们按递减顺序对整数进行排序,因为它使续集的陈述更加令人愉快,但当然可以反过来说明问题。
用于近似的排序的一个可能的准则是以下的(*):让是,对于每,我们要求(即, “准排序”列表从上方受递减函数。很容易看出实际排序满足以下条件:不得大于因此最多为,即,通常不得大于,即。
例如,可以通过以下算法(@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
| +
+
由于以下原因,此算法按预期工作:
- 如果元素在存储桶则。
放入存储桶,因此j≤\ lfloor N / v \ rfloor≤N / v
- 如果元素在存储桶则或。
Ĵ = 分钟(Ñ / v ,Ñ )Ĵ = ⌊ ñ / v ⌋ Ĵ = Ñ Ĵ = ⌊ ñ / v ⌋ Ĵ ≤ ñ / v < Ĵ + 1 ñ /(Ĵ + 1 )< v放入存储桶,因此或。在第一种情况下,,这意味着,因此。
对于,存储桶中从1到最多有元素。
令,令为桶1..j之一中元素的总数。通过2.我们有每个元素在水桶(与)是这样的,。因此,存储桶中从到的所有元素的总和大于。但是这个和也小于因此,因此 ,这使我们或。
满足(*)即的个元素使得
由3.我们有,所述的个元素,来自铲斗与因此。
该算法需要线性时间。
的计算需要线性时间。可以使用具有插入和迭代的链表来实现存储桶。嵌套循环运行的次数与元素的运行次数相同(即次)。