РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
250 of 1593 menu

Функция sort.Search

Функция sort.Search из пакета sort реализует бинарный поиск в отсортированном слайсе. Она принимает два аргумента: количество элементов n (длину слайса) и функцию f, которая определяет условие поиска. Функция возвращает индекс i, начиная с которого условие f(i) становится истинным. Если подходящий индекс не найден, возвращается n.

Важное условие: слайс должен быть отсортирован по возрастанию, а функция f должна быть монотонной (то есть возвращать false для всех индексов меньше искомого и true для всех индексов больше или равных искомому).

Синтаксис

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

Поиск в слайсе целых чисел

Найдем позицию для вставки числа 4 в отсортированном слайсе целых чисел:

package main import ( "fmt" "sort" ) func main() { numbers := []int{1, 2, 3, 5, 6, 7} target := 4 pos := sort.Search(len(numbers), func(i int) bool { return numbers[i] >= target }) fmt.Println(pos) }

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

3

Функция вернула индекс 3, так как элемент 4 должен стоять между индексами 2 (значение 3) и 3 (значение 5).

Поиск элемента в слайсе строк

Выполним поиск строки "d" в отсортированном слайсе строк:

package main import ( "fmt" "sort" ) func main() { letters := []string{"a", "b", "c", "d", "e"} target := "d" pos := sort.Search(len(letters), func(i int) bool { return letters[i] >= target }) if pos < len(letters) && letters[pos] == target { fmt.Println("found at index", pos) } else { fmt.Println("not found, would insert at index", pos) } }

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

"found at index 3"

Поиск по сложному условию

Найдем индекс первого числа, которое больше 3 в отсортированном слайсе:

package main import ( "fmt" "sort" ) func main() { numbers := []int{1, 2, 3, 4, 5, 6} pos := sort.Search(len(numbers), func(i int) bool { return numbers[i] > 3 }) fmt.Println("First number > 3 is at index", pos) fmt.Println("Value:", numbers[pos]) }

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

"First number > 3 is at index 3" "Value: 4"

Поиск в пустом слайсе

Проверим поведение функции на пустом слайсе:

package main import ( "fmt" "sort" ) func main() { var empty []int pos := sort.Search(len(empty), func(i int) bool { return empty[i] >= 5 }) fmt.Println(pos) }

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

0

Для пустого слайса функция всегда возвращает 0, так как функция-предикат ни разу не вызывается.

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

  • функцию sort.SearchInts,
    которая выполняет бинарный поиск в слайсе целых чисел
  • функцию sort.SearchStrings,
    которая выполняет бинарный поиск в слайсе строк
  • функцию sort.SearchFloat64s,
    которая выполняет бинарный поиск в слайсе чисел с плавающей точкой
  • функцию slices.BinarySearch,
    которая выполняет бинарный поиск в слайсе любого типа
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить