我刚刚回答了一个关于在快速排序实现中选择分区的不同方法的问题,然后遇到了一个问题,我真的不知道如何回答。这有点数学重,这可能不是提问的正确网站,所以如果需要移动,请告诉我,我会很乐意将其迁移到其他地方。
众所周知,随机选择枢轴的快速排序实现最终将在预期的O(n lg n)时间内运行(在维基百科上有一个很好的证明)。然而,由于生成随机数的成本,许多快速排序实现不会随机选择枢轴,而是依赖于“三数中值”方法,在该方法中确定性地选择三个元素,并从中选择中位数作为枢轴。众所周知,这会退化为最坏情况下的O(n^2)(例如,这篇论文介绍了如何生成这些最坏情况的输入)。
现在,假设我们通过从序列中选择三个随机元素并使用它们的中位数作为枢轴的选择来结合这两种方法。我知道这也可以使用略有不同的证明保证O(n lg n)平均运行时间。然而,我不知道在此特定快速排序实现中n lg n项前面的常数因子是多少。对于常规随机化快速排序,维基百科列出了随机化快速排序的实际运行时间至多需要1.39 n lg n比较(使用二进制对数作为lg)。
我的问题是:是否有人知道如何推导使用“三数中值”随机快速排序的比较次数的常数因子?更普遍地说,是否有一个表达式来计算使用随机中位数为基准的快速排序的常数因子?我很好奇,因为我认为如果这种方法存在某种“黄金点”,可以使比其他随机快速排序实现少进行比较。我的意思是,能不能说使用随机中位数选择的随机快速排序会进行最少的比较?或者可以明确地说你只需随机选择一个枢轴元素?
众所周知,随机选择枢轴的快速排序实现最终将在预期的O(n lg n)时间内运行(在维基百科上有一个很好的证明)。然而,由于生成随机数的成本,许多快速排序实现不会随机选择枢轴,而是依赖于“三数中值”方法,在该方法中确定性地选择三个元素,并从中选择中位数作为枢轴。众所周知,这会退化为最坏情况下的O(n^2)(例如,这篇论文介绍了如何生成这些最坏情况的输入)。
现在,假设我们通过从序列中选择三个随机元素并使用它们的中位数作为枢轴的选择来结合这两种方法。我知道这也可以使用略有不同的证明保证O(n lg n)平均运行时间。然而,我不知道在此特定快速排序实现中n lg n项前面的常数因子是多少。对于常规随机化快速排序,维基百科列出了随机化快速排序的实际运行时间至多需要1.39 n lg n比较(使用二进制对数作为lg)。
我的问题是:是否有人知道如何推导使用“三数中值”随机快速排序的比较次数的常数因子?更普遍地说,是否有一个表达式来计算使用随机中位数为基准的快速排序的常数因子?我很好奇,因为我认为如果这种方法存在某种“黄金点”,可以使比其他随机快速排序实现少进行比较。我的意思是,能不能说使用随机中位数选择的随机快速排序会进行最少的比较?或者可以明确地说你只需随机选择一个枢轴元素?