Зонтичная тема: что общего у четырёх приёмов с двумя индексами и как выбрать нужный. Сами приёмы разобраны каждый на своей странице.
Ключевые тезисы
- Общее у всех вариантов одно: два индекса, каждый идёт только вперёд, суммарно — один проход по входу.
- Граница применимости тоже общая: сдвиг указателя должен быть необратимым решением.
- Выбор варианта определяют три вопроса: подряд ли элементы, отсортирован ли вход, один ли это источник данных.
Какую задачу решает
Четыре разных приёма традиционно называют одним именем — «», — и от этого их путают. Общего у них действительно много: два индекса, каждый движется только вперёд, суммарно получается один проход по входу. Но задачи, которые они решают, почти не пересекаются, и выбирать между ними приходится осознанно.
Эта страница — про семейство целиком: что у вариантов общее, по каким вопросам выбирается нужный и на чём спотыкаются во всех четырёх. Сами приёмы разобраны каждый на своей странице, по одной и той же схеме из десяти шагов.
Внутри темы
4 приёма разобраны на отдельных страницах — по одной и той же схеме. Эта страница про то, что у них общее и как выбрать нужный.
Opposite-Direction Pointersактуально
Встречные указателиДва индекса сходятся с концов отсортированного массива. На каждом шаге отбрасывается конец, который заведомо не даст лучшего ответа, — и вместе с ним целая полоса пар.
Sliding Windowактуально
Скользящее окноОкно между двумя границами: правая расширяет, левая чинит. Состояние не пересчитывается, а обновляется инкрементально — отсюда линейное время на задачах о подотрезках.
Fast and Slow Pointersактуально
Быстрый и медленный указательДва указателя идут в одну сторону с разной скоростью. Если структура зациклена, быстрый догоняет медленного — цикл находится без журнала посещённых узлов.
Same-Direction Pointersактуально
Два указателя в одну сторонуСлияние, пересечение и запись на месте: каждому источнику свой указатель, ни один не откатывается назад. Основа сортировки слиянием и merge join в базах данных.
Подробный разбор
Четыре приёма семейства выглядят по-разному, но держатся на одном и том же. В задаче есть два индекса; каждый из них движется только вперёд по своему правилу; за весь алгоритм каждый проходит массив не больше одного раза. Отсюда линейное время: не потому, что цикл один, а потому, что суммарное число сдвигов ограничено длиной входа.
| Вариант | Куда движутся указатели | Что даёт |
|---|---|---|
| Встречные указатели | с двух концов навстречу | пары и тройки в отсортированном массиве |
| Скользящее окно | оба слева направо, между ними | подотрезки с ограничением |
| Быстрый и медленный | в одну сторону с разной скоростью | цикл, середина, k-й с конца |
| В одну сторону | по своему источнику каждый | слияние, пересечение, запись на месте |
Общая же граница применимости тоже одна: сдвиг указателя должен быть необратимым решением. Если может выясниться, что границу надо вернуть назад, приём неприменим — и дальше идут префиксные суммы, или динамика.
- Элементы должны идти подряд? Да — скользящее окно. Нет — дальше.
- Вход отсортирован и ищется пара или тройка? Да — встречные указатели. Нет — дальше.
- Данных два набора или нужна запись на месте? Да — указатели в одну сторону.
- Структура — список или последовательность состояний, вопрос про цикл, середину или k-й с конца? Быстрый и медленный.
Если ни один вопрос не дал «да», семейство, скорее всего, ни при чём. Частые соседи: префиксные суммы — когда речь про суммы с отрицательными числами, хеш-таблица — когда порядка нет, динамика — когда элементы ответа не обязаны идти подряд.
Разбор сигналов по всей главе собран отдельно — в теме как распознать паттерн задачи.
Чем заменяют
Видеолекции
Тайм-кода именно на эту тему в записях нет. Но глава «Алгоритмы и структуры данных» разобрана в курсе целиком — с той оговоркой, что место в записи придётся искать самому.
Связанные темы
Два указателя и окно
Opposite-Direction Pointers90%
Встречные указатели · Алгоритмы и структуры данныхДва индекса сходятся с концов отсортированного массива. На каждом шаге отбрасывается конец, который заведомо не даст лучшего ответа, — и вместе с ним целая полоса пар.
Sliding Window90%
Скользящее окно · Алгоритмы и структуры данныхОкно между двумя границами: правая расширяет, левая чинит. Состояние не пересчитывается, а обновляется инкрементально — отсюда линейное время на задачах о подотрезках.
Fast and Slow Pointers90%
Быстрый и медленный указатель · Алгоритмы и структуры данныхДва указателя идут в одну сторону с разной скоростью. Если структура зациклена, быстрый догоняет медленного — цикл находится без журнала посещённых узлов.
Same-Direction Pointers90%
Два указателя в одну сторону · Алгоритмы и структуры данныхСлияние, пересечение и запись на месте: каждому источнику свой указатель, ни один не откатывается назад. Основа сортировки слиянием и merge join в базах данных.
Prefix Sums90%
Префиксные суммы · Алгоритмы и структуры данныхОдин предварительный проход превращает сумму на любом отрезке в одно вычитание. Тот же приём вместе с хеш-таблицей находит подотрезок с заданной суммой за линейное время.
Monotonic Stack and Deque90%
Монотонный стек и дек · Алгоритмы и структуры данныхПриём поверх стека: хранить только тех, для кого ответ ещё не найден. Даёт ближайший больший элемент для всех позиций сразу и максимум в скользящем окне — за один проход.
Всё, что названо в описании, разобрано здесь же или в соседней теме — переходы под каждым определением.
Встречные указатели
Сходятся с концов отсортированного массива: пары, тройки, площадь, палиндром.
Отдельная тема: Opposite-Direction Pointers — Встречные указателиСкользящее окно
Оба индекса идут вправо, между ними — подотрезок с ограничением.
Отдельная тема: Sliding Window — Скользящее окноБыстрый и медленный
Разная скорость в одну сторону: цикл, середина, k-й с конца.
Отдельная тема: Fast and Slow Pointers — Быстрый и медленный указательУказатели в одну сторону
Слияние, пересечение и запись на месте: каждому источнику свой индекс.
Отдельная тема: Same-Direction Pointers — Два указателя в одну сторонуНеобратимость сдвига
Условие применимости всего семейства: границу нельзя возвращать назад.
Разбор ниже: Что общего у всех вариантовГлава «Алгоритмы и структуры данных» последний раз правилась . Нашли ошибку — напишите.