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{1, 3, 6, 10, 15, 21, 28, 36, 45, 55}
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 2 in [1 3 6 10 15 21 28 36 45 55]
示例(降序):
此示例演示搜索按降序排序的列表。该方法与按升序搜索列表相同,但条件相反。
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]
相关用法
- GO SearchFloat64s用法及代码示例
- GO SearchInts用法及代码示例
- GO Server.Shutdown用法及代码示例
- GO SectionReader用法及代码示例
- GO SendMail用法及代码示例
- GO SectionReader.ReadAt用法及代码示例
- GO ServeMux.Handle用法及代码示例
- GO SectionReader.Size用法及代码示例
- GO Server用法及代码示例
- GO SectionReader.Seek用法及代码示例
- GO SectionReader.Read用法及代码示例
- GO Scanner.Scan用法及代码示例
- GO StreamWriter用法及代码示例
- GO Split用法及代码示例
- GO Slice用法及代码示例
- GO StructTag.Lookup用法及代码示例
- GO SplitAfter用法及代码示例
- GO Sum256用法及代码示例
- GO Sin用法及代码示例
- GO Sprintf用法及代码示例
注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 Search。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。