簡體   English   中英

通過二進制搜索查找數字-最大和最小操作數

[英]Find number with binary search - maximum and minimum number of operations

我想知道如何計算最大和最小操作數,以找到定義范圍內的特定數目。
下面是示例代碼(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次運行)。
在哪里可以找到計算的理論解釋?

非常感謝!

二進制搜索的工作方式是將每個操作的搜索間隔減半。 因此,如果我有200個數字,則第一次迭代會將其降低到100,第二次迭代將其降低到50,然后是25、12、6、3、1,我們就完成了。 如果您有一定的數學背景,則該模式看起來非常熟悉-它是一個指數函數。 特別是,由於我們要處理二進制搜索,因此它的底數為指數2。

所以,如果你想知道你能有多少價值與操作的給定數量的搜索,它只是兩個力量-如果你只想讓8次操作,最多可以有2 ^ 8個值中搜索- 256。如果要從值的數量到(最大)操作數相反,則需要使用反函數-以2為底的對數。 4096的以2為底的對數是12。

為什么您的結果為11? 因為當i == val為true時,您不增加計數器; 但這僅是您使用的操作定義的問題。 涉及11個減半,因為最終操作不會減半。

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

您的答案是2的冪,它給出了搜索間隔的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM