【问题标题】:Go recursive binary search递归二分查找
【发布时间】:2015-12-16 08:07:10
【问题描述】:

我知道 Go 有一个包含搜索功能的 sort 包,但这是出于教育目的。我一直在尝试在 Go 中实现二进制搜索算法,但我无法让它工作。

这是我的代码:

package main

import "fmt"

func BinarySearch(data []int, target int, low int, high int) (index int, found bool)  {
    mid := (high + low) / 2
    if low > high {
       index = -1
       found = false
    } else {
        if target < data[mid] {
            BinarySearch(data, target, low, mid - 1)
        } else if target > data[mid] {
            BinarySearch(data, target, mid + 1, high)
        } else if target == data[mid] {
           index = mid
           found = true
        } else {
           index = -1
           found = false
        }
   }
   return
}

func main() {
  data := []int {2, 4, 6, 8, 9, 11, 12, 24, 36, 37, 39, 41, 54, 55, 56,}
  index, found := BinarySearch(data, 8, 0, len(data) - 1)
  fmt.Println(index, found)
}

它总是打印0 false。为什么?

【问题讨论】:

    标签: algorithm go binary-search


    【解决方案1】:

    二分搜索的逻辑是合理的。唯一的问题是您忘记将每个递归调用的结果分配给indexfound

    目前你有这些递归调用:

    BinarySearch(data, target, low, mid - 1)
    //...
    BinarySearch(data, target, mid + 1, high)
    

    您只需分配结果:

    index, found = BinarySearch(data, target, low, mid - 1)
    //...
    index, found = BinarySearch(data, target, mid + 1, high)
    

    【讨论】:

      【解决方案2】:

      二分查找逻辑

      • 目标是在数组中搜索一项。
      • 获取数组的中间项。
      • 如果大于所需值 => 第一项直到最后一项。
      • 如果小于所需值 => 中间项直到结束项
      • 重复过程

      我们使用递归或循环来实现这一点。

      使用递归进行二分查找

      函数将包含一个数组,我们将在其中进行搜索。那么目标值等于我们正在搜索的值。
      lowIndex 表示我们搜索的开始位置。
      highIndex 表示我们搜索的最后位置。
      然后函数返回我们正在搜索的目标值的位置。
      在参数中包含lowIndexhighIndex 的原因是为了搜索数组的子集。

      func binarySearch(array []int, target int, lowIndex int, highIndex int) int {
          //specify condition to end the recursion
          if highIndex < lowIndex {
              return -1
          }
          // Define our middle index 
          mid := int((lowIndex + highIndex) / 2)
          if array[mid] > target {
              return binarySearch(array, target, lowIndex,mid)
          }else if array[mid] < target {
              return binarySearch(array, target,mid+1,highIndex)
          }else {
              return mid 
          }
      }
      

      使用循环进行二分查找

      func iterbinarySearch(array []int, target int, lowIndex int, highIndex int) int {
          startIndex := lowIndex
          endIndex := highIndex
      
          var mid int
      
          for startIndex < endIndex {
              mid = int((lowIndex + highIndex) / 2)
              if array[mid] > target {
                  return binarySearch(array, target, lowIndex, mid)
              } else if array[mid] < target {
                  return binarySearch(array, target, mid+1, highIndex)
              } else {
                  return mid
              }
      
          }
          return -1
      }
      

      【讨论】:

        【解决方案3】:

        http://play.golang.org/p/BbL-y7pJMi

        据我所知,工作正常。

        【讨论】:

        • @zola :他没有很好地表述它,但你可以在他的代码中看到他做了一些修复(与 Michael Laszlo 的回答中描述的相同)使其正常工作
        • @mordeus 实际上不仅仅是一个仅链接的答案,您应该直接在您的答案中包含相关信息。在这种特定情况下,您应该指出您所做的更改以及更改的原因。 (请参阅How to Answer 的“为链接提供上下文”部分)。
        猜你喜欢
        • 2012-12-19
        • 1970-01-01
        • 2020-11-13
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-26
        • 2015-12-02
        相关资源
        最近更新 更多