鲜花:详细揭秘:随机选点快速排序的期望复杂度
前言
中午在知乎上看见有人狗叫随机化快排随便卡。
为了科学打脸,我尝试证明了一下随机化快排的复杂度。
因为我是复杂度分析低手,所以下面的证明只有代数内容,不涉及任何复杂度分析理论。
正文
为了方便证明,我们设序列中的数互不相同。否则,我们可以钦定相同数之间的大小关系,使得它们互不相同。
为了尽量严谨,本文所说的随机选点快速排序,以这样一种流程进行:
-
当区间长度 时,返回。否则,在目前的排序区间随机选择一个下标;
-
将小于这个值的元素放在选定下标的左侧,大于这个值的元素放在选定下标的右侧;
-
递归处理左右区间。
我们设 表示区间长度为 时,所需要的比较次数。因为序列中元素互不相同,所以 只和序列长度有关。
根据算法流程,对于 ,我们有:
对于第二个式子,整理一下:
现在问题转化为了分析 的复杂度量级。
尝试把 化为和式。
首先把分式消去:
然后仿照 ,列出 的递推式:
两式做差:
然后把递归式化作和式:
注意到我们想要的形式出现了!
不妨设:
则有:
根据经典结论, 是 量级的,所以 是 量级的。
所以,随机选点快速排序的复杂度量级不是符合直觉的 ,而是 的,但是由于这是期望复杂度,所以常数巨大,在实际情况中根本看不出二者的区别。
代数推导部分经数竞同学检查,如仍有错误请指出。
本文作者:Kenma
本文链接:https://www.cnblogs.com/Kenma/p/18686657
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步