使用二进制搜索查找数字 - 最大和最小操作数

时间:2017-03-08 15:30:26

标签: c# algorithm

我想知道如何计算最大和最小操作次数以查找定义范围内的特定数字 这里是示例代码(C#):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Random r = new Random();
            int min = 2047;
            int max = 4096;
            int val = min;
            int counter = 0;                
            int i = r.Next(2047, 4096);                
            while(true)
            {
               Console.WriteLine("--> "+val);
               if(i == val) break;                    
               val = (max-min)/2 + min;                    
               if(i>val) {
                   min = val;
               }
               else if(i<val) {
                   max = val;
               }
               counter++;
            }
            Console.WriteLine("\n\nThe calculated i is: "+val+", but i is: "+i+", done in "+counter+" counts.\n\n\n\n\n");
        }
    }
}

我可以看到,找到2047到4096范围内的随机数最多需要11次操作(基于10000次运行)。
我在哪里可以找到计算的理论解释?

非常感谢!

2 个答案:

答案 0 :(得分:1)

二进制搜索的工作方式是将每个操作的搜索间隔减半。因此,如果我有200个数字,第一次迭代将使其降至100,第二次迭代将降至50,然后是25,12,6,3,1,我们就完成了。如果你有一些数学背景,这个模式看起来很熟悉 - 这是一个指数函数。特别是,因为我们正在处理二进制搜索,所以它是基数为2的指数。

因此,如果您想知道可以使用给定数量的操作搜索多少个值,那么 的功率为2 - 如果您只想允许8个操作,则可以使用要搜索的2 ^ 8个值 - 256.如果你想反过来,从值的数量到(最大)操作数,你需要使用反函数 - 一个基数为2的对数。基数为4096的对数为12。

为什么你的结果是11?因为i == val为真时你不增加计数器;但这只是你使用的操作定义的问题。由于最终操作没有减半,所以涉及到11个减半。

答案 1 :(得分:0)

4096 - 2047 = 2049,等于2 ^ 11 + 1

你的答案是2的幂,它给你你搜索的间隔大小。