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

 更新时间:2023年12月22日 11:28:47   作者:低配全栈  
这篇文章主要为大家介绍了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 二分查找的资料请关注脚本之家其它相关文章!

相关文章

  • golang数组-----寻找数组中缺失的整数方法

    golang数组-----寻找数组中缺失的整数方法

    这篇文章主要介绍了golang数组-----寻找数组中缺失的整数方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang模拟令牌桶进行对访问的限流方式

    Golang模拟令牌桶进行对访问的限流方式

    这篇文章主要介绍了Golang模拟令牌桶进行对访问的限流方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go 语言 JSON 标准库的使用

    Go 语言 JSON 标准库的使用

    今天通过本文给大家介绍Go 语言 JSON 标准库的使用小结,包括序列化和反序列化的相关知识,感兴趣的朋友跟随小编一起看看吧
    2021-10-10
  • Golang中goroutine和channel使用介绍深入分析

    Golang中goroutine和channel使用介绍深入分析

    一次只做一件事情并不是完成任务最快的方法,一些大的任务可以拆解成若干个小任务,goroutine可以让程序同时处理几个不同的任务,goroutine使用channel来协调它们的工作,channel允许goroutine互相发送数据并同步,这样一个goroutine就不会领先于另一个goroutine
    2023-01-01
  • Go语言常用字符串处理方法实例汇总

    Go语言常用字符串处理方法实例汇总

    这篇文章主要介绍了Go语言常用字符串处理方法,实例汇总了Go语言中常见的各种字符串处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Go定时器的三种实现方式示例详解

    Go定时器的三种实现方式示例详解

    这篇文章主要为大家介绍了Go定时器的三种实现方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • go实现限流功能示例

    go实现限流功能示例

    这篇文章主要为大家介绍了go实现限流功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Golang中处理import自定义包出错问题的解决办法

    Golang中处理import自定义包出错问题的解决办法

    最近开始使用Go/GoLand在import自定义包时出现各种状况,下面这篇文章主要给大家介绍了关于Golang中处理import自定义包出错问题的解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • go mongox简洁高效文档操作及bson数据构造流畅技巧

    go mongox简洁高效文档操作及bson数据构造流畅技巧

    这篇文章主要为大家介绍了go mongox简洁高效文档操作及bson数据构造流畅技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Golang实现微信公众号后台接入的示例代码

    Golang实现微信公众号后台接入的示例代码

    这篇文章主要介绍了Golang实现微信公众号后台接入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论