我一直在阅读有关Quicksort的文章,并发现有时候它被称为“确定性快步”。
这是普通Quicksort的替代版本吗?普通Quicksort和确定性Quicksort之间有什么区别?
答案 0 :(得分:12)
普通(“确定性”)Quicksort在特定数据集上的行为可能非常差(例如,选择第一个未排序元素的实现在已排序数据上的时间复杂度为O(n ^ 2)。
随机化Quicksort(选择随机数据,而不是确定性选择)有时用于提供比所有数据集更好的预期性能。
答案 1 :(得分:9)
Quicksort在O(n log n)
预期/平均时间内运行,但O(n^2)
最坏情况。如果所选的枢轴始终是最小值或最大值,则会发生这种情况。
理想情况下,您希望选择中位数作为您的支点。如果直接找到中位数太昂贵(通常情况下,如果你试图使用quicksort就是这种情况),通常做的是取三个潜在枢轴元素的中位数,或者只选择一个随机元素作为你的支点
由于枢轴选择过程固有的随机性,后一种方法使快速排序不确定。
答案 2 :(得分:4)
通常,如果排序算法每次都以完全相同的顺序对元素进行一致排序,则它是“确定性的”。给出一组要对id(asc)进行排序的记录:
1 Censu
11 Marju
4 Cikku
11 Lonzu
然后排序算法可以返回Censu,Cikk,Marju,Lonzu或Censu,Cikku,Lonzu,Marju作为正确的排序。确定性排序是始终返回相同排序的排序。情况并非总是如此。在快速排序的情况下,如果随机选择枢轴,可以获得更快的平均性能(理想情况下,您可以选择中位数,但这可能会很昂贵)。但是,这需要付出代价:您的搜索不再具有确定性。
答案 3 :(得分:1)
您的来源可以(并且应该)给出自己的定义,但通常确定性快速排序是通过不依赖于随机数的公式选择枢轴的方法。例如,总是选择中间元素或始终选择第一个元素,或类似的东西。这意味着它的性能总是相同的(理论上无论如何,尽管在实践中差异不应该太大),无论你在同一输入上运行多少次。随机快速排序意味着您在选择枢轴时使用随机数,这意味着无法(轻松)预测同一输入上不同运行的性能。
答案 4 :(得分:1)
它与分区有关(或者从快速排序中使用的着名的Divide and Conquer中划分步骤)。如果每次最后(或任何位置的第一个元素或元素,每次数据集被分割时它必须是相同的位置)被用作分区的枢轴,则它是确定性快速排序。如果随机选择枢轴,那么它是随机快速排序。
这是一个lecture note,它将它放在一起。
我希望它有所帮助
欢呼声
答案 5 :(得分:1)
快速排序前面的常见形容词是确定性的和随机的。确定性意味着快速排序将始终以相同的方式对同一组数据进行排序,而随机快速排序使用随机化,并且很少以相同的方式对相同的数据进行排序(除非数据集非常小 - 那么它更常见)
<强>确定性强>
归结为如何选择枢轴。在确定性快速排序中,通过始终选择相同相对索引处的枢轴(例如第一个,最后一个或中间元素)或通过使用任何数量的预定元素选择的中值来选择枢轴。例如,一种常见的方法是选择第一个,最后一个和中间元素的中位数作为枢轴。即使使用我刚刚描述的3中值方法,某些数据集也很容易给出O(N ^ 2)时间复杂度。示例数据集是所谓的器官管道数据集:
array = [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1]
<强>随机强>
Randomizated quicksorts可以选择一个随机的枢轴或使用一些随机选择的枢轴的中位数。仍然存在O(N ^ 2)时间复杂度的可能性,但随着数据集大小的增加,概率变得更小,更小并且变小。
答案 6 :(得分:0)
除了许多其他人已经告诉过你如何实现确定性快速排序和非确定性快速排序之外,我相信这种类型的一个更重要的方面是,确定性快速排序,当密钥冲突时,您总是拥有相同的记录顺序,而使用非确定性快速排序时,每次运行排序时,此类记录的顺序可能不同。
我猜你有非独特的密钥时不应该使用非确定性快速排序。