证明修改后快速排序的运行时间= O(Nk)

时间:2011-12-22 11:37:40

标签: algorithm complexity-theory quicksort

这是一个家庭作业问题,我不是那个找到合理性但我正在努力的事情!

  • 三向分区是对快速排序的修改,它将元素分成小于,等于和大于数据透视的组。只需要递归地对较小和较大元素的组进行递归排序。显示如果有N个项目但只有k个唯一值(换句话说有很多重复项),则此修改对快速排序的运行时间为O(Nk)。

我的尝试:

平均情况:

树子例程将位于以下索引处:

我假设具有重复项的子程序将等于(n-k)

  • first:从0 - 到(i-1)
  • 第二名:i - (i +(n-k-1))
  • 第三:(i + n-k) - (n-1)
  • 比较次数=(n-k)-1

所以,

T(n) = (n-k)-1 + Sigma from 0 until (n-k-1) [ T(i) + T (i-k)]

然后我不确定我将如何继续:S

这可能是一个非常糟糕的开始:$ 希望能找到帮助

2 个答案:

答案 0 :(得分:5)

首先,你不应该看一下平均情况,因为O(nk)的上限可以证明是最坏的情况,这是一个更强有力的陈述。

您应该查看最大可能的递归深度。在正常快速排序中,最大深度为n。对于每个级别,完成的操作总数为O(n),在最坏的情况下总共提供O(n^2)

在这里,不难证明最大可能深度是k(因为每个级别将移除一个唯一值),这导致总共O(nk)

答案 1 :(得分:3)

我没有复杂的正规教育。但如果你把它看作一个数学问题,你可以证明它是一个数学证明。

对于所有排序算法, n 元素的最佳案例场景始终为 O(n),因为要对 n 元素进行排序至少考虑一次。现在,对于快速排序的特定优化,您所做的是简化了问题,因为现在,您只是对唯一值进行排序:与枢轴相同的所有值都已被视为已排序,并且由于其性质,快速排序将保证每个唯一值将在操作中的某个点作为枢轴,因此这消除了重复。

这意味着对于 N 大小列表,quicksort必须执行一些操作 N 次(对于列表中的每个位置一次),并且因为它正在尝试对list,该操作试图在列表中找到该值的位置,但由于您实际上只处理了唯一值,并且存在 k ,因此快速排序算法必须执行 k 每个元素的比较。因此,它使用 k 唯一元素为 N 大小的列表执行 Nk 操作。

总结:

  • 此算法消除了对重复值的检查。
  • 但是所有排序算法必须至少查看一次列表中的每个值。 N次操作
  • 对于列表中的每个值,操作是找到相对于列表中其他值的位置。
  • 由于重复项被删除,因此只会检查 k 值。
  • O(NK)