来自“Cormen Leiserson Rivest Stein,第3版,问题9-1,C点,第224页”,我有以下任务:
给定 n 数字的集合(数组) A ,使用订单统计 算法找到 i-th 最大的数字,围绕那个分区 编号,并对 i 最大数字进行排序。
我使用Randomized-Select算法(来自同一本书,第216页 - 它使用随机分区算法)找到第i个最小数字,而我想找到第i个最大号码(我们称之为“第k个”以避免混淆)。基本上,我可以获得第k个最大的数字:
n - ith + 1
然后我调用RandomizedSelect()来找到第k个最大的数字,并且一切都很棒!
这里有一个例子(在C中)我如何找到第4个最大的数字:
int A[10] = {3, 20, 15, 4, 1, 9, 18, 64, 22, 5}; // the given A set
int ith = 4; // I want to find the 4-th largest number of A
int kth = 10 - ith + 1; // I do this "conversion" for the reasons I explained above
int i = RandomizedSelect(A, 0, 9, kth); // it returns the index of A pointing to the 4-th largest number
printf("A vector: ");
for (j = 0; j < 10; j++) printf ("%u ", A[j]); // prints the A vector partially "ordered"
printf("\n4-th largest number: %u", A[i]); // prints the 4-th largest number
这里有一个输出的例子:
载体:3 1 4 5 9 15 18 64 22 20
第4大数字:18
现在我不仅希望得到第4个最大数字,而且还希望其他4个最大数字S按顺序排列(来自示例:18 20 22 64)。所以我只是在A向量上运行MergeSort(),从之前找到的第i个索引开始直到结束。输出将是:18 20 22 64。
问题在于赋值说我必须围绕第i个(第4个)最大数字进行分区并命令其他i(4)个最大数字,然后运行MergeSort(),如前所述。但是我无法理解为什么要这样做...在我的例子中,18左右的分区意味着什么,因为我尝试过,在我做了那个分区(调用SelectedPartition())后,这就是A向量的输出: / p>
3 1 4 5 9 15 18 64 22 20
18
......这是相同的输出!
那么,我对作业的误解是什么?或者,我是以更好的方式做到的吗?
答案 0 :(得分:2)
计算订单统计有许多不同的算法。许多像quickselect或median中位数算法一样,在第k个元素周围自动对数组进行分区,作为其实现的一部分。但是,无法保证选择算法必须这样做。例如,您可以通过将所有元素放入订单统计树数据结构,然后查询第k个元素来实现选择。因此,最好放入显式分区步骤以确保分区发生。
在您的情况下,由于您使用的是已经执行分区的算法,因此您可以放心地忽略此步骤。
希望这有帮助!