Введение в монотонный стек

Опубликовано: 21 Февраля, 2023

Стек — это в основном ограничительный массив, который использует свойство LIFO . Мы используем поп() и нажать() Операции по удалению и вставке элементов в стек соответственно.

Задачи на основе стека считаются очень простыми, но монотонные стеки обычно используются для решения задач среднего и сложного уровня.

Что такое монотонный стек?

Давайте разберемся с термином монотонные стеки, разбив его на части.

Монотонный = это слово для математических функций. Функция y = f(x) монотонно возрастает или убывает, если она соответствует следующим условиям:

  • Когда x увеличивается, y также всегда увеличивается, тогда это монотонно возрастающая функция.
  • Когда x увеличивается, y всегда уменьшается, тогда это монотонно убывающая функция.

См. приведенные ниже примеры:

  • y = 2x +5, это монотонно возрастающая функция.
  • y = -(2 x ), это монотонно убывающая функция.

Similarly, A stack is called a monotonic stack if all the elements starting from the bottom of the stack is either in increasing or in decreasing order.

Типы монотонного стека:

Существует 2 типа монотонных стеков:

  • Монотонно увеличивающийся стек
  • Монотонно убывающий стек

Монотонно увеличивающийся стек:

It is a stack in which the elements are in increasing order from the bottom to the top of the stack. 

Пример: 1, 3, 10, 15, 17

Как мы этого достигаем?

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

Шаги для реализации:

  • As we need monotonically increasing stack, we should not have a smaller element at top of a bigger element.
  • So Iterate the given list of elements one by one :
    • Before pushing into the stack, POP all the elements till either of one condition fails:
      • Stack is not empty
      • Stack’s top is bigger than the element to be inserted.
    • Then push the element into the stack.

Посмотрите на иллюстрацию ниже, чтобы понять идею:

Иллюстрация:

Consider an array Arr[] = {1, 4, 5, 3, 12, 10}
For i = 0: stk = {1}
For i = 1: stk = {1, 4}
For i = 2: stk = {1, 4, 5}
For i = 3: stk = {1, 3}  [pop 4 and 5 as 4 > 3 and 5 > 3]
For i = 4: stk = {1, 3, 12}
For i = 5: stk = {1, 3, 10} [pop 12 as 12 > 10] 

Ниже приведен код для вышеуказанного подхода:

Временная сложность: O(N)
Вспомогательное пространство: O(N)

Монотонный убывающий стек:

A stack is monotonically decreasing if It’s elements are in decreasing order from the bottom to the top of the stack. 

Пример: 17, 14, 10, 5, 1

Как мы этого достигаем?

Если мы извлекаем меньшие элементы из стека перед тем, как поместить новый элемент, стек будет уменьшаться снизу вверх.

Шаги для реализации:

  • As we need monotonically decreasing stack, we should not have a bigger element at top of a smaller element.
  • So Iterate the elements of the list one by one:
    • Before pushing into the stack, POP all the elements till either of one condition fails:
      • Stack is not empty
      • Stack’s top is smaller than the element to be Inserted.
    • Then push the element into the stack.

См. иллюстрацию ниже для лучшего понимания:

Иллюстрация:

Consider an array: arr[] = {15, 17, 12, 13, 14, 10}
For i = 0: stk = {15}
For i = 1: stk = {17} [pop 15 as 15 < 17]
For i = 2: stk = {17, 12}
For i = 3: stk = {17, 13}  [pop 12 as 12 < 13]
For i = 4: stk = {17, 14}  [pop 13 as 13 < 14]
For i = 5: stk = {17, 14, 10}

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(N)
Вспомогательное пространство: O(N)

Применение монотонного стека:

  • Монотонный стек обычно используется для решения типичной проблемы, такой как следующий больший элемент. NGE (найдите первое значение справа, которое больше элемента.
  • Также может использоваться для его сортов.
    • Следующий меньший элемент
    • Предыдущий больший элемент
    • Предыдущий меньший элемент
  • Кроме того, мы используем его для получения наибольшего или наименьшего массива или строки по заданным условиям (оставшийся размер k/нет дубликатов).

Преимущества монотонного стека:

  • Мы можем использовать дополнительное пространство монотонного стека, чтобы уменьшить временную сложность.
    • Мы можем получить ближайший меньший или больший элемент в зависимости от монотонного типа стека, просто извлекая верхний элемент стека, что является просто операцией O (1).
  • Монотонный стек помогает нам поддерживать максимальное и минимальное количество элементов в диапазоне и сохраняет порядок элементов в диапазоне. Поэтому нам не нужно снова сравнивать элементы один за другим, чтобы получить минимумы и максимумы в диапазоне. Между тем, поскольку он сохраняет порядок элементов, нам нужно только обновить стек на основе самого нового добавленного элемента.

Недостатки монотонного стека:

  • Это увеличивает пространственную сложность алгоритма в O(N) раз, т.е. на линейную сложность.
  • Часто с этим сложнее справиться, так как теперь с существующей проблемой нам также нужно аккуратно обращаться со стеком. Поскольку после извлечения элементов из стека мы не можем их вернуть.

Статьи по Теме:

  • Введение в стек — учебные пособия по структуре данных и алгоритмам
  • Следующий больший элемент (NGE) для каждого элемента в заданном массиве