在由随机数决定阵列的分割的情况下,我们如何避免产生出最差情况(虽然出现的机率很小),或是让最差的情况时间复杂度也是。
BFPRT演算法(由 Blum, Floyd, Pratt, Rivest 与 Tarjan 创造)可以实现出这一件事情,这是一个具有确定性(deterministic)的演算法,也就是不含任何随机的成分。
我们会产生出最差的情况为分割极度不平衡,也就是产生出这种分割,而会产生出这种分割,和我们的主元(pivot)的选择很有关系,如果我们可以保证选择到的主元(pivot)都是好的,确保不会产生出最差分割,这个主元是确定是最好的,也就是在样本空间无限大时,每一次的主元都是好的,而不是机率上趋近於最好。那麽这个演算法就可以避免掉最差情况的发生。而这就是BFPRT演算法的主要想法。
BFPRT演算法遵循以下五个步骤
范例 : 输入一个有34个元素的A阵列,
我们把上面这个阵列看作是一张图(graph),我们在两个节点(或是元素)定义以下符号,表示
我们把这样的符号,加到上面的图上
我们也对中位数构成的子阵列加上这样的符号
得到这张非常混乱,就像是我的面包版的图
我们使用箭头,表示是一个有向路径,也就是我们走访的路线,我们可以透过任一条路径,得知两个元素之间的大小关系,且通过这个路径,我们可以知道阵列每一个区块和之间的关系。
由箭头我们可以知道,,因此,上面的元素也必定小於,旁边的分组也是如此,因此我们可以知道,灰色区域框住的阵列区块中所有元素皆小於等於
而橘色部分中所有元素,必定大於等於
由上面这张图我们可以知道,每一个分组中有的元素会小於等於,而我们将这个含有个元素的阵列拆分成组(为含个元素的组),其中有的组会存在的元素会小於等於这个性质,因此,我们可以推导出以下性质:
给定个元素的阵列 :
而每一个分组中,也至少会有个元素大於等於,而我们将含有个元素的阵列猜分成组,其中有会具有的元素大於等於这个性质,
给定个元素的阵列 :
由上面的推论,我们可以得到以下性质
由上面这个性质我们可以知道,最多我们可以产生出一个个元素的分割情况,为了求上界,我们简化成最多产生出的分割情况,也就是在第5步中,BFPRT递回呼叫做多作用在个元素上。
下面推导BFPRT演算法最坏情况的执行时间
因此,的上限为以下关系式
,使用代换法求解
假设,则
,如果常数足够大,则为非负的项,观察可以发现,只要我们取的任意倍数,就可以实现了,而当,则为,如果足够大,则的上限就是,也就是线性时间。
在 Ruby 里的实体变数是有一个 @ 开头的变数,顾名思义,是活在每个实体里的变数,而且每个实体之...
[Day4] Web 小花花 不要问我为啥我的标题这麽傻白甜 我也不知道,取名好难 路上看到可爱小植...
在昨天内容中可以知道,JavaScript 采用了静态作用域,函式在定义时就已经确定作用域,而在产生...
上一篇用到的注册,其实是有点小问题的,像是如果用户名重复了,或是帐号密码都不打也可以注册 这一篇比较...
ㄧ. 前言 前面有说明如何运用TFIDF与BOW来表示一个句子/文本的表示方式,但若以BOW这样的方...