Функция slices.BinarySearchFunc
Функция slices.BinarySearchFunc выполняет бинарный поиск по пользовательской
функции сравнения. Она предназначена для поиска элементов в отсортированном
слайсе, когда необходимо использовать нестандартный критерий сравнения.
Первый параметр — слайс для поиска, второй — целевое значение, третий —
пользовательская функция сравнения, которая должна возвращать отрицательное,
нулевое или положительное значение, аналогично cmp.Compare.
Функция возвращает два значения: индекс найденного элемента и булевый флаг,
указывающий, найден ли элемент. Если элемент не найден, функция возвращает
индекс, куда этот элемент мог бы быть вставлен для сохранения порядка, и
false.
Синтаксис
slices.BinarySearchFunc(s, target, cmp)
Пример с поиском по длине строки
Давайте найдем в слайсе строку, длина которой равна 4, используя пользовательскую функцию сравнения:
package main
import (
"fmt"
"slices"
)
func main() {
// Слайс отсортирован по длине строк
s := []string{"a", "ab", "abc", "abcd", "abcde"}
target := 4
index, found := slices.BinarySearchFunc(s, target, func(s string, target int) int {
return len(s) - target
})
fmt.Printf("index: %d, found: %t\n", index, found)
}
Результат выполнения кода:
"index: 3, found: true"
Пример с поиском по структуре
Давайте выполним поиск в слайсе структур по полю Age, используя
пользовательскую функцию сравнения:
package main
import (
"fmt"
"slices"
)
type Person struct {
Name string
Age int
}
func main() {
// Слайс отсортирован по возрасту
people := []Person{
{Name: "Alice", Age: 25},
{Name: "Bob", Age: 30},
{Name: "Charlie", Age: 35},
{Name: "Dave", Age: 40},
}
targetAge := 35
index, found := slices.BinarySearchFunc(people, targetAge, func(p Person, age int) int {
return p.Age - age
})
fmt.Printf("index: %d, found: %t\n", index, found)
if found {
fmt.Printf("person: %+v\n", people[index])
}
}
Результат выполнения кода:
"index: 2, found: true"
"person: {Name:Charlie Age:35}"
Пример с элементом, отсутствующим в слайсе
Давайте выполним поиск значения, которого нет в слайсе, и посмотрим, какой индекс возвращается:
package main
import (
"fmt"
"slices"
)
func main() {
// Слайс отсортирован по значениям
numbers := []int{10, 20, 30, 40, 50}
target := 25
index, found := slices.BinarySearchFunc(numbers, target, func(num, target int) int {
return num - target
})
fmt.Printf("index: %d, found: %t\n", index, found)
if !found {
fmt.Printf("элемент должен быть вставлен на позицию %d\n", index)
}
}
Результат выполнения кода:
"index: 2, found: false"
"элемент должен быть вставлен на позицию 2"
Смотрите также
-
функцию
slices.BinarySearch,
которая выполняет бинарный поиск со стандартной функцией сравнения -
функцию
slices.SortFunc,
которая сортирует слайс по пользовательской функции сравнения -
функцию
slices.ContainsFunc,
которая проверяет наличие элемента по условию -
функцию
slices.IndexFunc,
которая возвращает индекс первого элемента, удовлетворяющего условию