用Golang在一个自定义结构体切片上执行二分查找的程序
二分查找是一种高效的查找算法,应用广泛。这里讲解如何在Golang中,在一个自定义结构体切片中执行二分查找。
自定义结构体
假设我们有这样一个自定义结构体:
type Person struct {
Name string
Age int
}
这个结构体有两个字段,分别是“Name”和“Age”。
切片排序
我们需要对切片进行排序以便于执行二分查找。Golang的标准库中提供了用于排序切片的函数“sort.Slice”。
var people = []Person{
{"Alice", 30},
{"Bob", 20},
{"Carl", 40},
{"David", 25},
}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
这里我们定义了一个包含四个Person的切片。我们通过传递一个函数(匿名函数)给“sort.Slice”函数,来按照年龄对Person进行排序。这个匿名函数返回true或false,表示第一个参数是否小于第二个参数。这里的排序方式是按照Person的年龄从小到大排序。
二分查找
经过排序后,我们可以使用二分查找算法来查找切片中的元素。我们使用“sort.Search”函数进行二分查找。
index := sort.Search(len(people), func(i int) bool {
return people[i].Age >= 25
})
if index < len(people) && people[index].Age == 25 {
fmt.Printf("Found %s at index %d\n", people[index].Name, index)
} else {
fmt.Println("Not found")
}
这个例子用来查找年龄为25的Person的位置。我们调用“sort.Search”函数,这个函数接收两个参数,第一个参数是需要查找的元素个数,这里是切片的长度,第二个参数是一个函数,这个函数用来比较中间元素和目标元素的大小关系。这个函数返回true或false,如果中间元素小于目标元素,则继续查找右半侧,否则查找左半侧。在这个例子中,如果中间元素的年龄小于25,则返回false,向右查找,否则返回true,向左查找。经过查找,如果找到目标元素,则返回该元素在切片中的位置,否则返回“未找到”。
示例代码和测试
完整的代码如下:
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
func main() {
var people = []Person{
{"Alice", 30},
{"Bob", 20},
{"Carl", 40},
{"David", 25},
}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
index := sort.Search(len(people), func(i int) bool {
return people[i].Age >= 25
})
if index < len(people) && people[index].Age == 25 {
fmt.Printf("Found %s at index %d\n", people[index].Name, index)
} else {
fmt.Println("Not found")
}
}
我们运行这个程序,会得到输出:“Found David at index 1”。
结论
通过Golang的标准库中提供的“sort.Slice”和“sort.Search”函数,我们可以在一个自定义结构体切片上执行二分查找。在使用之前,我们需要为需要查找的字段进行排序。使用这两个函数可以节省开发时间和提高程序效率。
极客笔记