多分查找法的性能分析--二分还是其他?

来源:互联网 发布:手机整人软件闪电 编辑:程序博客网 时间:2024/06/07 11:56

在一个有序数列中,共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) * logaK  /  2

= (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* t

期望E = Sn / K = (a2+a-2)*lg(K) / ( 2*a*lg(a) )

函数(a2+a-2) / ( 2*a*lg(a) )

 

a = 2时取最小值,

 

这个时候使用二分查找最优。

二分法的特点:非此即彼。

原创粉丝点击