Функция slices.BinarySearchFunc

Функция slices.BinarySearchFunc выполняет бинарный поиск по пользовательской функции сравнения. Она предназначена для поиска элементов в отсортированном слайсе, когда необходимо использовать нестандартный критерий сравнения. Первый параметр — слайс для поиска, второй — целевое значение, третий — пользовательская функция сравнения, которая должна возвращать отрицательное, нулевое или положительное значение, аналогично cmp.Compare.

Функция возвращает два значения: индекс найденного элемента и булевый флаг, указывающий, найден ли элемент. Если элемент не найден, функция возвращает индекс, куда этот элемент мог бы быть вставлен для сохранения порядка, и false.

Синтаксис

goslices.BinarySearchFunc(s, target, cmp)

Пример с поиском по длине строки

Давайте найдем в слайсе строку, длина которой равна 4, используя пользовательскую функцию сравнения:

gopackage 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)
}

Результат выполнения кода:

go"index: 3, found: true"

Пример с поиском по структуре

Давайте выполним поиск в слайсе структур по полю Age, используя пользовательскую функцию сравнения:

gopackage 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])
  }
}

Результат выполнения кода:

go"index: 2, found: true"
"person: {Name:Charlie Age:35}"

Пример с элементом, отсутствующим в слайсе

Давайте выполним поиск значения, которого нет в слайсе, и посмотрим, какой индекс возвращается:

gopackage 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)
  }
}

Результат выполнения кода:

go"index: 2, found: false"
"элемент должен быть вставлен на позицию 2"

Смотрите также

  • функцию slices.BinarySearch,
    которая выполняет бинарный поиск со стандартной функцией сравнения
  • функцию slices.SortFunc,
    которая сортирует слайс по пользовательской функции сравнения
  • функцию slices.ContainsFunc,
    которая проверяет наличие элемента по условию
  • функцию slices.IndexFunc,
    которая возвращает индекс первого элемента, удовлетворяющего условию