Давайте докажем, что крайний наихудший случай n * k
операций невозможен (просто чтобы понять, а остальные промежуточные значения можно доказать аналогичным образом):
Как добиться n * k
? На каждом шаге нам нужно сделать k
«хлопков» из дэка. Таким образом, элементы в deque выглядят так (на этом рисунке k == 5
):
перед:
| , #
| | | , # (like a heavy bowling ball)
| | | | , #
---------------------------------------------------
^^^^^^^^^ ^
our deque new badass element coming *vruuuum*
после
#
# *bang* (sound of all pins knoked down)
#
---------------------------------------------------
^
this new guy totally smashed our deque in 5 operations!
но эй ... подожди минутку
Как наша дека накопила k
элементов?
Ну, чтобы накопить k
элементов, на предыдущих шагах k
он должен выдавать гораздо меньше (иначе деко будет пустым с самого начала). Дерьмо ... нет n * k
для тебя: (
Это делает более общее утверждение о динамике нашего алгоритма:
Если i
-й элемент массива приведет к m
"всплывающему" из очереди, предыдущие элементы наверняка будут "хромыми" достаточно, чтобы выровнять "наглость" i
-го элемента.
Теперь, если вы смотрите не с точки зрения deque, а с точки зрения целого массива: каждый раз, когда вы выбрасываете уникальный элемент массива . Таким образом, количество «всплывающих окон» не должно быть больше, чем количество элементов в массиве, которое составляет n
.
Что делает нашу сложность O(n)
.