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中goroutine和channel使用介绍深入分析
一次只做一件事情并不是完成任务最快的方法,一些大的任务可以拆解成若干个小任务,goroutine可以让程序同时处理几个不同的任务,goroutine使用channel来协调它们的工作,channel允许goroutine互相发送数据并同步,这样一个goroutine就不会领先于另一个goroutine2023-01-01go mongox简洁高效文档操作及bson数据构造流畅技巧
这篇文章主要为大家介绍了go mongox简洁高效文档操作及bson数据构造流畅技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-11-11
最新评论