Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go 二分查找

Go语言实现二分查找方法示例

作者:低配全栈

这篇文章主要为大家介绍了Go语言实现二分查找方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

使用官方sort包提供search方法快速实现

对已经排好序的数据, 想快速地找出某一个在对应slice的位置索引, 我们可以使用官方sort包提供的search方法快速地实现二分查找.

官方源码实现也非常简单

func Search(n int, f func(int) bool) int {
  // Define f(-1) == false and f(n) == true.
  // Invariant: f(i-1) == false, f(j) == true.
  i, j := 0, n
  for i < j {
    h := int(uint(i+j) >> 1) // avoid overflow when computing h
    // i ≤ h < j
    if !f(h) {
      i = h + 1 // preserves f(i-1) == false
    } else {
      j = h // preserves f(j) == true
    }
  }
  // i == j, f(i-1) == false, and f(j) (= f(i)) == true  =>  answer is i.
  return i
}

sort.Search的作用就是通过二分法, 找到满足条件的, 即函数f返回true的数据的最小索引, 如果无法找到目标值, 则返回参数n的结果.

在实际业务中, n一般都是使用查找切片数据的长度, 所以在Search方法返回之后, 需要判断i是否还是目标切片的合理索引.

查找第一个大于等于x的索引

func SearchTargetAfter(dataList []int, x int) int {
    return sort.Search(len(dataList), func(i int) bool {
        return dataList[i] >= x
    })
}

查找第一个小于等于x的索引

func SearchTargetBefore(dataList []int, x int) int {
    return sort.Search(len(dataList), func(i int) bool {
        return dataList[i] <= x
    })
}

查找一个确定的数

那么我就要查找一个确定的数, 我们该怎么做呢?

举个例子

arrInts := []int{1, 3, 4, 9, 12, 13}
findPos := sort.Search(len(arrInts), func(i int) bool {
  return arrInts[i] == 4
})

结果输出, 并不是2, 而是6. 仔细去看上面的源码也不难发现, 官方的二分查找的方法, 如果使用了数值相等来判断, 就要让数据正好落在每次的二分的位置这样才能找到, 比如上述的代码中, 原始的切片数据不变的情况下, 如果改为查找的目标为9, 那么是可以正确获取位置的.

因此这里要注意, 如果要查找确定的数字的目标位置, 使用sort.Search方法的时候, func的返回值, 需要使用上述的找到第一个大于等于目标索引的位置, 或者小于等于目标索引的位置, 得出来索引位置之后, 再去获取索引值是否跟目标数据一样, 来判断该数据是否存在这个数组中以及它所处的位置.

以上就是Go语言实现二分查找方法示例的详细内容,更多关于Go 二分查找的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文