Все темы
140

Поиск в отсортированной матрице от угла

Tier 1Закрыто

Где применяется

1. Задача

У тебя есть сетка чисел, и числа в ней стоят по порядку. В каждой строке они растут слева направо. В каждом столбце они растут сверху вниз. Тебе дают искомое число, и надо ответить на один вопрос: есть оно в сетке или нет?

Проще всего посмотреть на каждую клетку. Но в большой сетке это медленно. Порядок чисел помогает пропустить почти все клетки и дойти до ответа одной короткой дорожкой.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит
Поиск 14 в сетке, отсортированной по рядам и столбцам
searchMatrix([[1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]], 14)
matrix: каждый ряд и каждый столбец возрастают
01234
01471115
12581219
23691622
31013141724
41821232630
row = 0col = 4target = 14steps = 0

Есть ли 14 в матрице? Начинаем с правого верхнего угла: слева от него всё меньше, снизу всё больше.

Гонка скорости
Поиск одного значения в одной и той же отсортированной таблице 6 на 8

Столбики: 48 ячеек таблицы, ряд за рядом; каждый ряд и каждый столбец возрастают. Искомое число в нижнем ряду. В таблице ниже n означает число ячеек квадратной таблицы.

Одна операция: одна проверенная ячейка. За каждый кадр все дорожки делают одинаковое число операций, поэтому медленная отстаёт.

Перебор всех ячеек O(m·n)
операций: 0
Поиск лесенкой O(m + n)
операций: 0

 

А если чисел больше

Операции для n чисел и примерное время при 100 миллионах простых операций в секунду. Это оценка по тому же счёту, а не замер.

n = 1 000
Перебор всех ячеек1 тыс. · меньше 1 мс
Поиск лесенкой63,2 · меньше 1 мс
n = 100 000
Перебор всех ячеек100 тыс. · 1 мс
Поиск лесенкой632,5 · меньше 1 мс
n = 10 000 000
Перебор всех ячеек10 млн · 100 мс
Поиск лесенкой6,3 тыс. · меньше 1 мс

Как узнать

Поиск в матрице (отсортированная сетка) (Matrix search (sorted grid))

Эти слова в условии значат этот паттерн

  • матрица отсортирована и по строкам, и по столбцам
  • поиск значения в 2D отсортированной сетке
  • начать с угла и отбрасывать строку или столбец
  • и строки, и столбцы монотонны

Похоже, но не то

  • Бинарный поиск (массив) (Binary search (array))

    Если каждый ряд продолжает предыдущий, сетка это один отсортированный список. Тогда работает обычный бинарный поиск.

  • Два указателя (с концов) (Two pointers (opposite ends))

    Ход лесенкой это та же идея в двух измерениях. За шаг двигается ровно один индекс.

  • Обход матрицы (спираль / диагонали) (Matrix traversal (spiral / diagonal))

    Там посещается каждая клетка в выбранном порядке. Здесь большинство клеток не читается вовсе.

  • Линейный поиск (Linear search)

    Перебор работает и стоит O(rc). Расточительным его делает как раз наличие порядка.

Сетка r на c даёт O(r + c) при ходе лесенкой. Полностью отсортированная сетка позволяет O(log rc).

На LeetCode

Задачи на сетку, где отсортированы и строки, и столбцы, и спрашивают, есть ли значение или сколько значений лежит ниже какой-то границы. Начни с правого верхнего угла, и каждое сравнение отбрасывает строку или столбец, это O(rows + cols).

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности