快速选择算法 - 简化说明
Posted
技术标签:
【中文标题】快速选择算法 - 简化说明【英文标题】:Quickselect Algorithm - Simplified Explanation 【发布时间】:2012-06-07 08:24:47 【问题描述】:我在HERE 之前问过这个问题,但是我希望进一步简化快速选择(基于快速排序)的解释。我问的上一个问题包括一些示例代码(所以你知道我在说什么)。
我想知道是否有人在任何时候将快速选择的规则和指南总结为游戏,人们可以通过遵循易于理解的规则来了解算法的工作原理,这些规则可以应用于一副纸牌或数字在纸片上。
我认为快速选择算法的简化解释对于我理解它的工作原理至关重要,因为我收到的教程和解释仍然难以掌握和可视化。甚至 youtube 上将快速排序变成舞蹈的视频也没有太大帮助。
在此先感谢 Stack,到目前为止,您提供了很大的帮助。
【问题讨论】:
究竟你不明白什么? pivot 的概念,以及在整个递归过程中如何重复选择它,以及如何拆分列表以及如何操作每个子列表。 枢轴只是您选择的列表中的一个点,以帮助您进行递归(例如未排序列表中的第一项)。这为您将获得的列表的两半提供了随机性,因此您更有可能在两半之间获得均匀分布。 但是枢轴是列表分裂的点吗? 你熟悉divide and conquer algorithm principle吗?因为快速排序/选择什么都不做。 【参考方案1】:你走进一个有 200 名儿童的体育馆。现在是 9 月 8 日,所以你渴望找到第 98 个最矮的孩子。你知道你可以把它们从最短到最高排列起来,但这需要很长时间。 “我知道”,你会想,“我可以使用 QUICKSELECT!”
你走进人群,闭上眼睛,伸出手指,转了三圈。当你睁开眼睛时,你正直指其中一个孩子,彼得·皮沃特。你说:“快!比彼得矮的人都站到这边来。比彼得高的人都站到那边去。如果你和彼得一样高,你可以进入任何一组。”
孩子们来来往往,很快他们就站在了两组中。你数了数,发现矮个组有 120 个孩子,高个组有 79 个孩子。你知道第 98 个最矮的孩子一定是矮个子组,所以你告诉彼得和 79 个个子高的孩子坐在看台上。
你再次闭上眼睛,伸出手指,转了三圈。当你睁开眼睛时,你正直指着彼得的妹妹宝拉·皮沃特。你说:“快!那些还站着的人。如果你比宝拉矮,就站到这里来。如果你比宝拉高,就站到那里。如果你和宝拉一样高,你可以进入任一组。”
孩子们来来往往,很快他们就站在了两组中。你数了数,发现矮个组有 59 个孩子,高个组有 60 个孩子。你知道第 98 个最矮的孩子必须在较高的一组,所以你告诉 Paula 和 59 个矮个的孩子坐在看台上。
你再次闭上眼睛,伸出手指,转了三圈。当你睁开眼睛时,你正直指宝拉的表弟,普鲁登斯枢轴。你说:“快!那些还站着的人。如果你比普鲁登斯矮,就站到这里来。如果你比普鲁登斯高,就站到那边。如果你和普鲁登斯一样高,你可以进入任一组。”
孩子们来来往往,很快他们就站在了两组中。你数了数,发现矮个组有 37 个孩子,高个组有 22 个孩子。你知道宝拉和其他 59 个矮个子的孩子正坐在看台上。加上还站着的 37 个矮个子,你知道一共有 97 个孩子比 Prudence 矮。所以,普鲁登斯是第98个最矮的孩子!
快速选择 FTW!
【讨论】:
我不确定我现在更喜欢哪一个 - 大笑还是感觉知情。这很可能是我读过的最令人惊奇的故事,并且绝对是对该算法的最佳和最容易理解的解释。先生,您应该得到一枚非常闪亮的奖章。 :D 所以这个策略会假设孩子(数据列表)是未排序的?所以每个孩子在进入他们的小组之前必须将他/她自己与支点进行比较? 是的。对于 QuickSelect,您始终假定数据未排序,因为如果它已经排序,您可以直接转到所需的插槽。 这是解释快速选择的好方法! @LoveMeow 平均为 O(n),但最坏情况为 O(n^2)以上是关于快速选择算法 - 简化说明的主要内容,如果未能解决你的问题,请参考以下文章