奇数长阵列快速小阶统计算法的正确性

时间:2017-12-15 00:36:46

标签: arrays algorithm sorting median median-of-medians

Problem 9-3 of the textbook Intro to Algorithms (CLRS)描述了一种快速O(n)算法,用于查找长度为n的数组的第k阶统计量(排序时数组中的第k个元素),对于k为多的特定情况小于n。当n为奇数时,我不确定该算法的正确性,并希望看到一种方法来证明它是正确的。

基本思想是我们首先将数组分成两半,第一部分是floor(n / 2)元素,第二部分是ceil(n / 2)元素。然后,我们"合作伙伴"前半部分中的每个元素与后半部分中的对应元素。当n为奇数时,会留下剩余的未合并元素。

对于每对合作伙伴,我们确保左侧合作伙伴是> =正确的合作伙伴,如果没有,则交换两个合作伙伴。然后,递归地找到后半部分的第k阶统计量,镜像在后半部分中进行的任何交换,并在前半部分中进行相应的交换。在此之后,整个数组的第k阶统计量必须在前半部分的前k个元素中,或者在后半部分中的前k个元素中。

我的困惑来自于数组长度n为奇数的情况,并且后半部分中有一个没有伙伴的单独元素。由于递归是在后半部分执行的,由数组的最后一个ceil(n / 2)元素组成,包括单独的无伙伴最后一个元素,我们应该镜像在后半部分中进行的所有交换,并在相应的内部进行交换上半年的合作伙伴,当其中一个掉期涉及最终因素时,不清楚该做什么,因为它没有合作伙伴。

教科书似乎并没有特别注意这个问题,所以我假设当交换涉及最终元素时,那么就不要让合作伙伴进行任何镜像移动。上半场。结果,最后的元素只是“偷”"与谁交换的合作伙伴。但是,在这种情况下,是否有一种简单的方法来查看算法是否仍然正确?如果当最后一个元素窃取了其他人的伙伴时,该伙伴实际上是第k个订单统计数据,并且稍后会被交换到一个无法访问的位置?涉及顺序统计选择的递归和分区的机制对我来说是不够透明的,这样我就无法自信地排除这种情况。

1 个答案:

答案 0 :(得分:1)

我不认为你对算法的描述是完全准确的(但是你所解释的解释远非明确)。据我了解,算法对于奇数长度数组是正确的原因如下:

让我们首先看一下偶数长度数组的几个例子,其中n = 10且k = 3(即我们正在寻找第三个最小的元素,即2):

a.  5 2 7 6 1 9 3 8 4 0  
b.  5 1 7 6 2 9 3 8 4 0  
c.  5 0 7 6 2 9 3 8 4 1  
d.  5 0 7 6 2 9 3 8 1 4  

如果我们将数组分成两部分,我们得到:

a.  5 2 7 6 1    9 3 8 4 0  
b.  5 1 7 6 2    9 3 8 4 0  
c.  5 0 7 6 2    9 3 8 4 1  
d.  5 0 7 6 2    9 3 8 1 4  

和这对夫妇:

a.  (5,9) (2,3) (7,8) (6,4) (1,0)  <- 0 coupled with 1
b.  (5,9) (1,3) (7,8) (6,4) (2,0)  <- 0 coupled with 2
c.  (5,9) (0,3) (7,8) (6,4) (2,1)  <- 1 coupled with 2
d.  (5,9) (0,3) (7,8) (6,1) (2,4)  <- 0, 1 and 2 not coupled with each other

在比较和交换情侣之后,他们的最小元素在第一组中,我们得到:

a.  5 2 7 4 0    9 3 8 6 1  
b.  5 1 7 4 0    9 3 8 6 2  
c.  5 0 7 4 1    9 3 8 6 2  
d.  5 0 7 1 2    9 3 8 6 4  

您将看到最小的元素0将始终位于第一组中。第二小元素1将在第一组中,或者如果它与最小元素0耦合则在第二组中。第三小元素2将在第一组中,或者在第二组中,如果它与最小元素0或第二小元素1耦合。

所以最小元素在第一组中,第二和第三小元素可以在任一组中。这意味着第三小元素是第一组中的3个最小元素之一,或者是第二组中的2个(!)最小元素之一。

a.  5 2 7 4 0    9 3 8 6 1  ->  0 2 4 + 1 3  
b.  5 1 7 4 0    9 3 8 6 2  ->  0 1 4 + 2 3  
c.  5 0 7 4 1    9 3 8 6 2  ->  0 1 4 + 2 3  
d.  5 0 7 1 2    9 3 8 6 4  ->  0 1 2 + 3 4  

因此,如果我们说整个数组的第k个最小元素现在是任何一个组中第k个最小元素之一,那么第二个组中就有一个可用的点,并且&#39;为什么,在奇数长度数组中,我们将未耦合元素添加到第二组。无耦合元素是否是我们正在寻找的元素,它肯定是任何一个组中的第k个最小元素之一。

事实上,更确切地说,第k个最小元素是第一组中的k个最小元素之一,或者是第二个组中的k / 2 + 1个最小元素之一。我实际上不确定算法是最优的,甚至是正确的。有很多重复的比较和交换正在进行,并且当交换另一组中的相应元素时,跟踪一对夫妇和交换元素的想法似乎没有意义。< / I>