sort包中的BinarySearch

问题描述 投票:0回答:2

我正在 Go

sort
包中查看这个函数,并且很好奇是否有一种直接的方法来识别切片中是否存在元素?
在 Java Arrays.binarySearch(..) 中,仅返回负值。我很好奇 golang 的 api 

func SearchInts(a []int, x int) int

是否报告 x 不存在?不确定为什么

func SearchInts(a []int, x int)
不返回两个值
func SearchInts(a []int, x int)
    

algorithm api sorting go binary-search
2个回答
5
投票

(index,isPresent)



4
投票
文档

i := sort.SearchInts(slice, value) if i<len(slice) && slice[i]==value { // It exists } 函数在排序的整数切片中搜索x并返回Search指定的索引。

因此,根据文档中提供的示例,如下所示:

SearchInts

您将得到以下输出:

package main import ( "fmt" "sort" ) func main() { a := []int{1, 2, 3, 4, 6, 7, 8} x := 2 i := sort.SearchInts(a, x) fmt.Printf("found %d at index %d in %v\n", x, i, a) x = 5 i = sort.SearchInts(a, x) fmt.Printf("%d not found, can be inserted at index %d in %v\n", x, i, a) }

幸运的是,从 GO 的最新版本 1.21 开始,有一个新的 
slices

包可用,其中包括 found 2 at index 1 in [1 2 3 4 6 7 8] 5 not found, can be inserted at index 4 in [1 2 3 4 6 7 8]

 函数,它的行为与您想要的 Java 类似(通过返回
BinarySearch 如果找到值,请输入)例如
bool

根据文档:
BinarySearch 在已排序的切片中搜索目标并返回找到目标的位置,或者目标在排序顺序中出现的位置;它还返回一个布尔值,表示是否确实在切片中找到了目标。切片必须按升序排序。

根据您的需要进行一些调整,您可以在评估条件时跳过

package main import ( "fmt" "slices" ) func main() { names := []string{"Alice", "Bob", "Vera"} n, found := slices.BinarySearch(names, "Vera") fmt.Println("Vera:", n, found) n, found = slices.BinarySearch(names, "Bill") fmt.Println("Bill:", n, found) } Output: Vera: 2 true Bill: 1 false

返回值,而只使用

int
值。例如:
bool

这将产生以下输出:

package main import ( "fmt" "slices" ) func main() { names := []string{"Alice", "Bob", "Vera"} if _, found := slices.BinarySearch(names, "Bob"); found { fmt.Println("Bob:", found) } }

此外,该函数使用泛型下划线,因此它不仅适用于 
Output: Bob: true

类型,还适用于任何其他类型。

最后但并非最不重要的一点是,还有一个 

int

函数的替代版本,可让您在

BinarySearch
 使用自己的比较函数。如果您需要一些自定义比较逻辑,这可能对您也很有用。
如果您想深入了解,可以在

https://tip.golang.org/doc/go1.21

查看 GO v1.21 的完整发行说明。

© www.soinside.com 2019 - 2024. All rights reserved.