【问题标题】:Binary Search and duplicates二进制搜索和重复
【发布时间】:2015-01-15 20:27:43
【问题描述】:

假设我们是一个数组 {–2, 8, 13, 22, 25, 25, 38, 42, 51, 103}

当二分搜索第一次将其一分为二时,中间值会被认为是什么?

我自己的猜测是名为 25 的第二个值,因为只有这样搜索才知道它是相同的。

【问题讨论】:

    标签: search theory binary-search


    【解决方案1】:

    我相信它总是试图通过

    找到中间
    (0+n)/2 = (0+9)/2 = 4(Integer)
    

    在你的情况下。

    因此,如果您想搜索 25 本身,根据您将在下限组中找到的算法,首先将位置 4 作为匹配项。

    【讨论】:

      【解决方案2】:

      中间值是前 25 个数字。

      您的 binarySearch 第一次调用类似于: binarySearch(a,1,a.length) ,其中“a”是您的数组。

      您的数组长度为 10 ,因此 m = ((10-1) +1)/2 = 5 在数组中的位置。

      然后调用 binarySearch(1,m) 并对这个数组应用相同的方法(原始数组的前半部分) –2、8、13、22、25

      【讨论】:

      • 您好,谢谢您的回答。 m = ((10-1) +1)/2 中的 +1 究竟是什么?
      • 这是数学。要找到从 a 到 b 的长度,请执行 (b-a) +1 。例如,您的数组长度为 10。第一个元素在第一个位置( a = 1 ),最后一个元素在 10 位置,所以长度是 10-1+1 = 10
      • 另一个例子:m = 5,所以对数组后半部分的 binarySearch 调用是 binarySearch(a,m+1,a.length) = binarySearch(a,6,10) 并且这个调用将在这个数组 {25 , 38 , 42 , 51 , 103} 上工作;要找到数组的这一半的 m,您必须知道它的长度(谁是 5,但您必须找出答案): 10-6+1 =5 和 m 将是 5/2 =2
      猜你喜欢
      • 2020-11-16
      • 1970-01-01
      • 2019-05-02
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2013-10-22
      • 2016-10-20
      相关资源
      最近更新 更多