【问题标题】:Find the Kth smallest element in the list using Partition - Help me understand使用分区查找列表中第 K 个最小的元素 - 帮助我理解
【发布时间】:2012-03-03 02:08:49
【问题描述】:

好的,我有一个任务是使用几种不同的方法在列表中找到第 K 个最小的元素....

第一种方法是对列表进行排序,然后返回第 K 个最小的元素。简单,我的心态是说list=10个元素,把list升序排序,然后返回第10个位置的元素

下一个方法使用来自 Quicksort 的分区:

"第二种算法是应用快速排序中使用的过程 Partition。该过程对数组进行分区,以便所有小于某个枢轴项的元素在数组中位于它之前,所有大于该枢轴项的元素在其后它。枢轴项所在的槽称为枢轴位置。我们可以通过分区来解决选择问题,直到枢轴项位于第 k 个槽。如果k小于枢轴位置,我们通过递归分割左子数组来做到这一点,如果 k 大于枢轴位置,则递归分割右子数组。当 k = 枢轴位置时,我们就完成了。"

假设我有一个包含 10 个项目的列表:

3 8 9 2 4 5 1 7 10 6,以 5 为轴心。我知道我通常会有 2 个数组

3 2 4 1 和 8 9 7 10 6

但我不明白的是:“我们可以通过分区来解决选择问题,直到枢轴项目位于第 k 个插槽。”

第 k 个插槽是什么?对我来说,我一直在想 kth = 数组的长度,所以在这种情况下是 10。其中会有 6 个值,这显然不是最低的......而且不正确。

有人可以使用这个示例数组并告诉我这个算法的含义以及它如何找到第 k 个/最小的元素吗?谢谢

【问题讨论】:

  • 您在中途重新定义了 k:第一个 k 是搜索元素的顺序(可能小于数组的长度,例如第二小的从 1 开始计数时,10 元素数组中的元素具有 k=2),然后您说 k 是数组的长度。 kth slot 就是数组中的第 k 个位置。
  • 好吧,这消除了一些误解......但我仍然感到困惑。说我给出的示例数组,假设我想找到第三个最小的元素,并且枢轴始终是第一个项目。我想我不明白如何知道“什么”是数组之前的第三个最小元素是完全排序的?我想我只需要有人为我展示它,所以我明白......
  • 我怎么知道 k 是小于还是大于枢轴位置?
  • 这是基于的重要属性:快速排序的分区功能确保枢轴之前的所有元素都小于或等于枢轴(尽管不一定排序)并且枢轴之后的所有元素都大于枢轴(再次,不一定排序)。
  • 我的意思是..我明白这一切。但我觉得我只能知道列表完全排序后的第 K 个最小元素是什么......

标签: java algorithm selection quicksort


【解决方案1】:

我认为您以复杂的方式看待解决方案。

这就是使用 QuickSort 找到第 k 个最小元素的方法(当然不完全是快速排序,我会告诉你原因)。

在快速排序中,您选择一个随机枢轴元素并将整个数组分成两部分,然后对左右子数组进行递归排序以形成整个排序后的数组。

在这个问题中你不必这样做。你所做的只是,

  1. 随机选择一个枢轴元素。
  2. 用 [Sub-array 1 ] Pivot [Sub-array2] 划分数组,其中子数组 1 的元素少于枢轴,子数组 2 的元素 大于枢轴。
  3. 检查子数组 1 的大小。
   If it is,
        a.Greater than 'k' then your kth element lies in the first sub-array. Go recursively. Start sorting the sub-array1 alone and you can entirely discard the sub-array2 as you can be sure that 'kth' element cannot occur at a position greater than k! Repeat step-1 for the right sub-array
        b.Lesser than 'k' then your kth element lies in the second sub-array. Again do as said above. Repeat step-1 for left subarray.
        c.If the size of sub-array1 is k-1 then your pivot element must be the kth largest element in your array.Bingo! you have your 'kth' largest element in the array

所以为了解决您的疑问,

在这里,您不是对整个数组进行排序,而是对其中的一部分进行排序 它。(即使那也不完全正确。如果你完全明白,你会得到它 理解我上面的解释。)

【讨论】:

    【解决方案2】:

    在快速排序中,一旦您的枢轴位置为 k,左侧的所有内容都较小,右侧的所有内容都较大,因此如果您只需要第 k 个值,则无需继续排序。

    【讨论】:

    • 我想我不明白的是,如果没有完全排序,我怎么知道枢轴位置是否为 k?
    • 在我的例子中假设我想要第三个最小的元素.. 我怎么知道我的枢轴位置何时变为“3”,那是第三个最小的元素,除非数组完全排序并且我可以那样检查?如果这有任何意义..
    • k 已给出,因此如果您的枢轴位置为 k,那么您就完成了。例如,如果 k=1 或 2,您可能必须在 pivot=k 之前对整个数组进行排序,然后在中间开始快速排序。
    • 好吧,我觉得我现在感觉很慢。但对我来说,这听起来像是假设 k = 3,那么这意味着当枢轴位置的元素为 9 时算法结束?
    • 如果 k=3,当枢轴位置为 3 时,您将返回值 '3'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2012-10-22
    • 1970-01-01
    • 2021-08-29
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多