在由隨機數決定陣列的分割的情況下,我們如何避免產生出最差情況(雖然出現的機率很小),或是讓最差的情況時間複雜度也是。
BFPRT演算法(由 Blum, Floyd, Pratt, Rivest 與 Tarjan 創造)可以實現出這一件事情,這是一個具有確定性(deterministic)的演算法,也就是不含任何隨機的成分。
我們會產生出最差的情況為分割極度不平衡,也就是產生出這種分割,而會產生出這種分割,和我們的主元(pivot)的選擇很有關係,如果我們可以保證選擇到的主元(pivot)都是好的,確保不會產生出最差分割,這個主元是確定是最好的,也就是在樣本空間無限大時,每一次的主元都是好的,而不是機率上趨近於最好。那麼這個演算法就可以避免掉最差情況的發生。而這就是BFPRT演算法的主要想法。
BFPRT演算法遵循以下五個步驟
範例 : 輸入一個有34個元素的A陣列,
我們把上面這個陣列看作是一張圖(graph),我們在兩個節點(或是元素)定義以下符號,表示
我們把這樣的符號,加到上面的圖上
我們也對中位數構成的子陣列加上這樣的符號
得到這張非常混亂,就像是我的麵包版的圖
我們使用箭頭,表示是一個有向路徑,也就是我們走訪的路線,我們可以透過任一條路徑,得知兩個元素之間的大小關係,且通過這個路徑,我們可以知道陣列每一個區塊和之間的關係。
由箭頭我們可以知道,,因此,上面的元素也必定小於,旁邊的分組也是如此,因此我們可以知道,灰色區域框住的陣列區塊中所有元素皆小於等於
而橘色部分中所有元素,必定大於等於
由上面這張圖我們可以知道,每一個分組中有的元素會小於等於,而我們將這個含有個元素的陣列拆分成組(為含個元素的組),其中有的組會存在的元素會小於等於這個性質,因此,我們可以推導出以下性質:
給定個元素的陣列 :
而每一個分組中,也至少會有個元素大於等於,而我們將含有個元素的陣列猜分成組,其中有會具有的元素大於等於這個性質,
給定個元素的陣列 :
由上面的推論,我們可以得到以下性質
由上面這個性質我們可以知道,最多我們可以產生出一個個元素的分割情況,為了求上界,我們簡化成最多產生出的分割情況,也就是在第5步中,BFPRT遞迴呼叫做多作用在個元素上。
下面推導BFPRT演算法最壞情況的執行時間
因此,的上限為以下關係式
,使用代換法求解
假設,則
,如果常數足夠大,則為非負的項,觀察可以發現,只要我們取的任意倍數,就可以實現了,而當,則為,如果足夠大,則的上限就是,也就是線性時間。