使用黑匣子排序


20

假设我们想要一个列表排序,Sn实数。假设我们得到一个黑匣子,它可以立即对实数进行排序。使用这个黑匣子,我们可以获得多少优势?n

例如,是否可以仅使用调用黑盒来对数字进行排序?我发现的最佳算法是对黑盒使用调用。但是我无法进一步改进它。这是我的算法,类似于merge-sort:nO(n)n

首先将列表划分为大小约为列表。然后使用调用黑盒对这些列表进行排序。最后,使用黑框合并排序列表,如下所示:S小号1s ^2şns1,s2,...,snnn

将列表中的最小元素放入新列表,然后调用黑盒对其进行排序。在数(第一和的最小元素)将在最小数目。我们可以将其放在输出列表的第一位。 假设已从选择元素,我们将替换为排序列表的第二个最小元素,然后再次运行黑盒以计算的第二个最小成员。 我们继续进行,直到所有元素都被排序为止。此部分的黑匣子调用总数为L [ 1 ] L S s j L [ 1 ] s j S n - LL[1]LS
sjL[1]sjS
nn。因此,总的通话总数为n

另一方面,看起来我们应该能够使用排序所需的数字比较中的下界来获得下界:我们可以使用来实现黑盒nlgn=12nlgn比较。如果我们可以通过调用来解决该问题,并在线性时间内进行合并,则可以使用比较对实数进行排序,这是不可能的。nonlgno(n)no(nlgn)

我猜想我们可以证明是调用黑盒的次数的下限,因为黑盒中使用的许多比较将被共享,因此在我们的论点中被重新叙述。Ω(n)

更新:正如其他帖子所建议的,也可以实现。nlgn


2
您的评论似乎有错字。您是不是要说:“没有算法使用小于调用本机可排序ñ少于实数ňLGñ比较“PS:你也应该小心的事实?ňLGň下限仅适用于比较基于排序算法。NNNlgNNlgN
卡韦赫

8
我想我们甚至可以得到使用AKS的排序网络。他们的网络可以看作是模型的实例,黑盒子可以对大小为2的块进行排序。他们的算法使用Ologn轮,每轮调用2排序器On次。之一的“圆”øÑ2-分拣机可以很容易地模拟ÔO(nlogn)O(logn)O(n)O(n)O(n) 分类器。n
Vinayak Pathak

6
@VinayakPathak:将输入数据分解成大块2N,然后在用替换每个比较器之后,使用AKS网络对块进行排序N/2分类器。N
Jeffε

1
@Jɛff E:是的,太好了,那肯定比我的构造简单。
Vinayak Pathak

1
@Jɛff E,您的评论可以作为答案。:)
Kaveh

Answers:


15

可以用调用黑框,不进行比较。O(nlogn)

首先,考虑以下平衡分配问题:给定元素A [ 1 .. m ](其中mA[1..m]),将它们划分成两组,最小尺寸为至少约的/4,使得第一组中的所有元素是比所述第二组中的所有元素小。可以用Om/nmnm/4呼叫黑匣子。(稍后将对此进行描述。)然后对这种分区算法使用quicksort:O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

假设每个分区步长为调用黑盒,在给定输入A[1 ..n]的情况下,上述算法将使OO(m/n)A[1..n]调用黑盒,因为递归树的深度为Ologn),并且树的每个级别的总深度为On/O(nlogn)O(logn)呼叫黑匣子。O(n/n)=O(n)

请按照以下步骤进行分区:

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

在算法partition()的最后一步:“对X周围的所有m个元素进行分区”,这会不会使用m个额外的比较?
Vinayak Pathak

2
请参见算法后面的代码行,其中说明了如何执行此步骤。我将对其进行编辑以使其更加清晰。
Neal Young

24

我认为您的问题在Beigel和Gill于1990年发表的论文“ 使用k- sorter 对n个对象进行排序 ”中得到了解决,该论文的摘要说明了一切:

k分类器是一种在单位时间内对k个对象进行分类的设备。使用k分类器的算法的复杂度定义为k分类器的应用次数。在这种情况下,对n个对象进行排序的复杂度在n log n之间4nlognnlognklogk,直到n和k中的一阶项。4nlognklogk


谢谢。我找不到纸。您可以提供论文或证明的链接吗?
AmeerJ


也在citeseerx上
卡夫

8
请注意,当,Beigel和Gill的界是Θk=nΘ(n)

12

O(nlogn)n

kn2(n/k)2k2n/k

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

n=18k=4ķ分拣机。

enter image description here

正如该图所希望的那样,该算法将输入数组分解成大小的块 ķ/2,然后使用 ķ-sorter in place of a compare-exchange operation. Correctness follows by observing that the network correctly sorts any array of 0s and 1s.

As @VinayakPathak's comment suggests, the O((n/k)2) bound can be reduced by replacing bubblesort with a different sorting network. For example, Batcher's even-odd mergesort reduces the number of black-box calls to O((n/k)log2(n/k))=O(nlog2n), and the AKS sorting network reduces it to O((n/k)log(n/k))=O(nlogn). This last algorithm matches Neal's non-oblivious algorithm up to (large!!) constant factors.


thanks. Can a Ω(n lg(n)) lower bound be proved?
AmeerJ

2
No, Biegel and Gill's paper implies an upper bound of O(n).
Jeffε

+1 for that nice picture! I may be mistaken but it seems to me that it is not entirely correct (correct me if I'm wrong). Assuming the output is in ascending order, if the smallest element is in the last position there is no "path" for it to "travel" to the first position. Changing "for i = 1 to m" to "for i = 1 to m+1" seems to correct this, although it might introduce some unnecessary overhead.
George

@George Oops, you're right; I need one more layer!
Jeffε
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.