Блог пользователя Medina

Автор Medina, 12 лет назад, По-русски

Доброй ночи. Я постоянно слышу о двух указателях, но толком разобраться в этом самостоятельно не смогла. Кто-нибудь может мне подробнее о них рассказать? В каких задачах они используются? Буду благодарна, если кинете ссылки на теоретические материалы :)

  • Проголосовать: нравится
  • +11
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

Примеров задач на 2 указателя очень много. Но в голову так сразу ничего не приходить. Поэтому такой искусственный, но простой пример: есть массив из 105 положительных чисел нужно найти количество подмассивов c суммой больше либо равной k. Понятно можно перебрать левую границу и подбирать правую бинпоиском. Это решение будет за O(n * logn). Можно по другому заведем два числа lf = 0 и rg = 0 (как раз два указателя) теперь будем увеличивать lf. После каждого увеличения lf будем двигать (увеличивать) rg пока сумма на подотрезке не станет больше либо равна k. Это будет работать за O(n). В качестве более сложного примера задача о нахождении треугольника наибольшей площади среди заданных n точек.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    то есть суть в том, чтобы хранить одновременно левую и правую границу? я кажется не допоняла ваш пример, разве он не за О(n^2) работает? (для каждой левой увеличивать правую?)

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      В том и суть, что асимптотика линейная. Левая и правая границы двигаются только вправо, а значит, что каждая сделает только O(N) операций.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Вся фишка в том что rg не надо сбрасывать при каждом увеличении lf. Поэтому решении будет работать ровно за 2 * n действий

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        спасибо) а в задаче про треугольники в качестве rg используется 3-я точка?

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          а как в более сложных задачах понять, что этот метод сработает? то есть как понять, что rg не надо сбрасывать? мне почему-то это не слишком очевидно)

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

            Это приходит с опытом) Обычно срабатывает что-то вроде "если какое-то условие неверно для интервала [l;r], то для всех меньших оно тоже неверно". Тогда можно двигать вправо l и бессмысленно двигать когда-либо r обратно.

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Ну это уже от задачи зависит. Очень часто на монотонных фукнциях где можно решать бинпоиском можно и указателями, таким образом пропадает логарифм из асимптотики.

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится

          Про точки нужно решать так: построим выпуклую оболочку всех точек. Утверждение что искомый треугольник имеет вершины в выпуклой оболочке. Теперь перебираем первую точку по выпуклой оболочке произвольным образом. Перебираем вторую точку в порядке по или против часовой стрелки. А третью двигаем указателем в том же порядке что и вторую, пока ответ улучшается. Таким образом решение за O(n2). Ну правильность этого еще нужно доказать. Вроде про это рассказывалось на лекциях в Харькове (кажется лекция Левина).

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            спасибо) очень четкое объяснение)

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Вот тут пишут, что после построения выпуклой оболочки, треугольник наибольшей площади ищется за O(n). Решение тоже через 3 указателя, но перебирается только первый, а два остальных увеличиваются пока улучшается ответ.

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            У нас на обласной олимпиаде была эта задача, только уже была построена выпуклая оболочка (был дан выпуклый многоугольник, нужно найти треугольник...)

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится -8 Проголосовать: не нравится

    Отличный пример, реально помог. Спасибо!

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Ещё пример. На окружности отмечено N точек, они даны в порядке обхода по часовой стрелке. Нужно за линейное время (O (N)) найти пару наиболее удалённых точек.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Самый простой пример. Дан отсортированный массив, нужно найти в нем 2 числа, сумма которых равна нулю например. Решать можно за O (N) как раз двумя указателями.

»
12 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Из классики в MergeSort, например.

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Вот еще задача на три указателя, достаточно известная если не ошибаюсь была на каком-то финале.

Есть k эльфов и n оленей. У каждого эльфа и у каждого оленя есть свои характеристики: ai — у эльфов, bj — у оленей. Для того чтобы составить рождественскую повозку, нужно взять два оленя и одного эльфа, при том так чтобы bj1 < ai < bj2, где j1, j2, i — номера оленей и эльфов. Сколько пар повозок мы сумеем составить?

Авторское решение — O(nlogn)

P.S. если у кого есть точное условие — напишите

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Ещё пример. CR #112: C. Еще одна строковая задача можно решать так.

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Обобщается ли утверждение про то, что треугольник максимальной площади можно искать тремя указателями на произвольный m-угольник?