将二进制搜索数组拆分为不等的部分

时间:2015-11-30 19:27:09

标签: algorithm formula

在排序数组中的二进制搜索的原始迭代版本中,我们计算中点如下:
m = (i+j)/2 (请发言)

但是,如果我们决定将它分成不等的部分,如1/3和2/3,我们使用这个公式: m = (2i+j)/3 (请发言)

所以,我希望你的公式帮助将它分成(1/4和3/4),(1/5和4/5)或(2/5和3/5)。
我只需要m的值,不是整个代码。

仅供参考,m = 3i+j/4 (将数组拆分为1/4和3/4是不正确的?)

1 个答案:

答案 0 :(得分:0)

我们做一些数学运算:

假设:

  1. i是数组的较低索引,
  2. j是数组的较高索引,
  3. m是数组的分区索引,通过以x:y比率对数组进行分区来获得。
  4. 参见下面的评估:

    <------x-----><----------y------------->
    .-------------.------------------------.
    ^             ^                        ^
    i             m                        j
    
    therefore, it can be represented as 
          (m-i)/(j-m)   =   x/y
       =>     y.(m-i)   =   x.(j-m)
       =>   y.m - y.i   =   x.j - x.m
       =>   y.m + x.m   =   x.j + y.i
       =>     (x+y).m   =   x.j + y.i
       =>           m   =   (x.j + y.i)/(x+y)   (this is the final result)
    

    案例1:(1/4和3/4)或可以写为1:3

        m   =   (x.j + y.i)/(x+y)
    =>  m   =   (1.j + 3.i)/(1+3)
    =>  m   =   (j + 3.i)/4
    

    案例2:(1/5和4/5)或可以写成1:4

        m   =   (x.j + y.i)/(x+y)
    =>  m   =   (1.j + 4.i)/(1+4)
    =>  m   =   (j + 4.i)/5
    

    案例3:(2/5和3/5)或可写为2:3

        m   =   (x.j + y.i)/(x+y)
    =>  m   =   (2.j + 3.i)/(2+3)
    =>  m   =   (2.j + 3.i)/5