多分查詢法的效能分析--二分還是其他?
在一個有序數列中,共K個數字,在其中查詢一個數字,常使用二分查詢方法對資料進行分段以縮小範圍進行定位來替代遍歷。
另外一個相似的問題模型,K個電阻串連在一起,有1個電阻壞了,導致電路不通,問如何測定找到這個故障電阻。
問題的提出:常用方法都是採用二分法,現在考慮下采用3分呢,4分呢,……,K分呢(最極端的K分其實就是遍歷了)。
分支(廣度)少則深度大,現通過數值計算對多分查詢進行效能分析,來看廣度和深度二者應如何處理。
假設進行a 分處理,第一次分支後,每個節點的查詢次數分別為1,2,…… a , 第二次分支後,每個節點的查詢次數在其父節點的基礎上進行累加。
圖1
查詢次數期望E = S / K
S為所有子節點查詢次數之和
由樹形圖可見
S1 = (1 + a)*a / 2 = t
遞推公式為
n 為分支次數,即樹的高度,an = K
Sn = a*Sn-1 + an-1 * t
整理,得
S1 = t
S2 = aS1 + a*t = 2at
S3 = aS2 + a2 t = 3a2t
S4 = aS3 + a3 t = 4a3t
Sn = n * an-1 * t
an = K
n = logaK = lgK / lg(a)
期望E = (1 + a) * loga
= (1 + a) * lgK / (2*lg(a) )
函式 (1 + a) / (2*lg(a)) 影象
(線上函式作圖http://www.e-tutor.com/et2/graphing)
a 為整數,在a = 4 時取最小值.
這種計算方法可以改進,每層的最後一個節點可以直接和其前面的節點次數一樣。以一個笑話為例:
男:你喜歡我嗎?
女:你猜?
男:喜歡。
女:再猜。
猜1次已經足夠了。
調整圖1
公式一樣,只是t = (1 + a) * a / 2 – 1
Sn = n * an-1
期望E = Sn / K = (a2+a-2)*lg(K) / ( 2*a*lg(a) )
函式(a2+a-2) / ( 2*a*lg(a) )
在 a = 2時取最小值,
這個時候使用二分查詢最優。
二分法的特點:非此即彼。