当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


GO Search用法及代码示例


GO语言"sort"包中"Search"函数的用法及代码示例。

用法:

func Search(n int, f func(int) bool) int

搜索使用二分搜索来查找并返回 [0, n) 中 f(i) 为真的最小索引 i,假设在 [0, n) 范围内,f(i) == true 意味着 f(i+ 1) == 真。也就是说,搜索要求 f 对于输入范围 [0, n) 的某些(可能为空)前缀为假,然后对(可能为空)余数为真;搜索返回第一个真正的索引。如果没有这样的索引,Search 返回 n。 (请注意,"not found" 返回值不是 -1,例如,strings.Index。)搜索仅对 [0, n) 范围内的 i 调用 f(i)。

Search 的一个常见用途是在排序的、可索引的数据结构(例如数组或切片)中查找值 x 的索引 i。在这种情况下,参数 f(通常是闭包)捕获要搜索的值,以及数据结构的索引和排序方式。

例如,给定一个按升序排序的切片数据,调用 Search(len(data), func(i int) bool { return data[i] >= 23 }) 返回最小索引 i 使得 data[i] > = 23。如果调用者要查找23是否在切片中,则必须单独测试data[i] == 23。

搜索按降序排序的数据将使用 <= 运算符而不是 >= 运算符。

为了完成上面的示例,以下代码尝试在按升序排序的整数切片数据中查找值 x:

x := 23
i := sort.Search(len(data), func(i int) bool { return data[i] >= x })
if i < len(data) && data[i] == x {
	// x is present at data[i]
} else {
	// x is not present in data,
	// but i is the index where it would be inserted.
}

作为一个更异想天开的例子,这个程序猜测你的号码:

func GuessingGame() {
	var s string
	fmt.Printf("Pick an integer from 0 to 100.\n")
	answer := sort.Search(100, func(i int) bool {
		fmt.Printf("Is your number <= %d? ", i)
		fmt.Scanf("%s", &s)
		return s != "" && s[0] == 'y'
	})
	fmt.Printf("Your number is %d.\n", answer)
}

示例(降序):

此示例演示搜索按降序排序的列表。该方法与按升序搜索列表相同,但条件相反。

package main

import (
	"fmt"
	"sort"
)

func main() {
	a := []int{55, 45, 36, 28, 21, 15, 10, 6, 3, 1}
	x := 6

	i := sort.Search(len(a), func(i int) bool { return a[i] <= x })
	if i < len(a) && a[i] == x {
		fmt.Printf("found %d at index %d in %v\n", x, i, a)
	} else {
		fmt.Printf("%d not found in %v\n", x, a)
	}
}

输出:

found 6 at index 7 in [55 45 36 28 21 15 10 6 3 1]

相关用法


注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 Search。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。