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 二分查找的资料请关注脚本之家其它相关文章!

相关文章

  • Go中的动态速率限制有效控制流量

    Go中的动态速率限制有效控制流量

    这篇文章主要为大家介绍了Go中的动态速率限制有效控制流量,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Golang实现短网址/短链服务的开发笔记分享

    Golang实现短网址/短链服务的开发笔记分享

    这篇文章主要为大家详细介绍了如何使用Golang实现短网址/短链服务,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-05-05
  • Go语言中结构体方法副本传参与指针传参的区别介绍

    Go语言中结构体方法副本传参与指针传参的区别介绍

    这篇文章主要给大家介绍了关于Go语言中结构体方法副本传参与指针传参的区别的相关资料,文中先对GO语言结构体方法跟结构体指针方法的区别进行了一些简单的介绍,来帮助大家理解学习,需要的朋友可以参考下。
    2017-12-12
  • 浅析GO语言的垃圾回收机制

    浅析GO语言的垃圾回收机制

    今天我们来聊聊golang是如何进行垃圾回收的,我们知道,目前各语言进行垃圾回收的方法有很多,如引用计数、标记清除、分代回收、三色标记等,各种方式都有其特点,文中介绍的非常详细,感兴趣的小伙伴跟着小编一起学习吧
    2023-07-07
  • Go语言中的if条件语句使用详解

    Go语言中的if条件语句使用详解

    这篇文章主要介绍了Go语言中的if条件语句的使用,包括if...else语句以及相关嵌套,需要的朋友可以参考下
    2015-10-10
  • Go Redis客户端使用的两种对比

    Go Redis客户端使用的两种对比

    这篇文章主要为大家介绍了Go Redis客户端使用对比详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 从零封装Gin框架实现数据库初始化GORM

    从零封装Gin框架实现数据库初始化GORM

    这篇文章主要为大家介绍了从零封装Gin框架实现数据库初始化GORM,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Golang实现不被复制的结构体的方法

    Golang实现不被复制的结构体的方法

    sync包中的许多结构都是不允许拷贝的,因为它们自身存储了一些状态(比如等待者的数量),如果你尝试复制这些结构体,就会在你的 IDE中看到警告,那这是怎么实现的呢,下文就来和大家详细讲讲
    2023-03-03
  • golang生成JSON以及解析JSON

    golang生成JSON以及解析JSON

    这篇文章主要介绍了golang生成JSON以及解析JSON,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • go-zero 组件布隆过滤器使用示例详解

    go-zero 组件布隆过滤器使用示例详解

    这篇文章主要为大家介绍了go-zero组件介绍之布隆过滤器使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论