人,只有自己站起来,这个世界才能属于他。|

园龄:粉丝:关注:

鲜花:详细揭秘:随机选点快速排序的期望复杂度

前言

中午在知乎上看见有人狗叫随机化快排随便卡。

为了科学打脸,我尝试证明了一下随机化快排的复杂度。

因为我是复杂度分析低手,所以下面的证明只有代数内容,不涉及任何复杂度分析理论。

正文

为了方便证明,我们设序列中的数互不相同。否则,我们可以钦定相同数之间的大小关系,使得它们互不相同。

为了尽量严谨,本文所说的随机选点快速排序,以这样一种流程进行:

  • 当区间长度 1 时,返回。否则,在目前的排序区间随机选择一个下标;

  • 将小于这个值的元素放在选定下标的左侧,大于这个值的元素放在选定下标的右侧;

  • 递归处理左右区间。

我们设 fi 表示区间长度为 i 时,所需要的比较次数。因为序列中元素互不相同,所以 fi 只和序列长度有关。

根据算法流程,对于 f,我们有:

f0=f1=0

fn=n1+1ni=0n1fi+fni1

对于第二个式子,整理一下:

fn=n1+2ni=0n1fi

现在问题转化为了分析 fn 的复杂度量级。

尝试把 fn 化为和式。

首先把分式消去:

nfn=n2n+2i=0n1fi

然后仿照 fn,列出 fn1 的递推式:

(n1)fn1=(n1)2n+1+2i=0n2fi

两式做差:

nfn=(n+1)fn1+2(n1)

然后把递归式化作和式:

fn=(n+2)i=1n1i+123(n1)

注意到我们想要的形式出现了!

不妨设:

gn=i=1n1i

则有:

fn=2(n+1)gn83(n+1)

根据经典结论,gnO(lnn) 量级的,所以 fnO(nlnn) 量级的。

所以,随机选点快速排序的复杂度量级不是符合直觉的 O(nlogn),而是 O(nlnn) 的,但是由于这是期望复杂度,所以常数巨大,在实际情况中根本看不出二者的区别。

代数推导部分经数竞同学检查,如仍有错误请指出。

本文作者:Kenma

本文链接:https://www.cnblogs.com/Kenma/p/18686657

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   _Kenma  阅读(34)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起