Sliding window

Sliding window — это «скользящее окно»: приём, когда ты смотришь не на все данные сразу, а на ограниченный кусок, который постепенно сдвигается вперёд.

Главная идея:

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

Например, есть массив:

[1, 3, 2, 5, 4, 6]

Окно размера 3:

[1, 3, 2]  5  4  6
 1 [3, 2, 5] 4  6
 1  3 [2, 5, 4] 6
 1  3  2 [5, 4, 6]

То есть окно как бы едет по данным.

Sliding window часто используют, когда нужно найти что-то в последовательности:

  • максимальную сумму подмассива длины k;
  • самую длинную подстроку без повторяющихся символов;
  • среднее значение за последние N элементов;
  • количество событий за последние N секунд.

Например: найти максимальную сумму трёх подряд идущих чисел.

Наивно можно каждый раз считать сумму заново:

1+3+2 = 6
3+2+5 = 10
2+5+4 = 11
5+4+6 = 15

Но sliding window делает умнее:

первая сумма = 1 + 3 + 2 = 6

сдвиг:
убираем 1
добавляем 5

новая сумма = 6 - 1 + 5 = 10

То есть не пересчитываем всё окно заново, а просто:

currentSum = currentSum - leftElement + newRightElement

Вот в этом смысл: экономия вычислений за счёт обновления состояния окна.

В сетях

В сетях sliding window — это механизм передачи данных, например в TCP.

Смысл такой: отправитель может послать не один пакет и ждать подтверждения, а сразу несколько пакетов в пределах разрешённого окна.

Например:

можно отправить пакеты 1, 2, 3, 4
ждём подтверждения
пришло подтверждение за 1
окно сдвигается
теперь можно отправить 5

То есть окно показывает:

сколько данных можно отправить, не дожидаясь подтверждения каждого отдельного пакета.

Это нужно для баланса между скоростью и контролем перегрузки.

В rate limiting

Sliding window часто используют для ограничения запросов.

Например:

не больше 100 запросов за последние 60 секунд.

Тут важно именно за последние 60 секунд, а не «с 12:00:00 до 12:01:00».

Окно всё время двигается вместе со временем:

текущее время: 12:00:45
окно: 11:59:45 — 12:00:45

текущее время: 12:00:46
окно: 11:59:46 — 12:00:46

Это более честный лимит, чем fixed window, потому что нельзя сделать 100 запросов в конце одной минуты и ещё 100 в начале следующей.

В контексте LLM / ChatGPT

Там sliding window может означать ограниченный контекст модели.

Например, модель может «видеть» только последние N токенов. Когда диалог становится длиннее, старые части начинают выпадать из активного окна.

Условно:

[старый контекст][средний контекст][новый контекст]
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  активное окно

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

Коротко

Sliding window — это техника работы с последовательностью, где:

берём ограниченный фрагмент данных
двигаем его по последовательности
обновляем результат постепенно
не пересчитываем всё с нуля

Самая простая формула смысла:

новое окно = старое окно - то, что ушло слева + то, что пришло справа

По-русски нормально сказать:

«скользящее окно», «механизм скользящего окна», «алгоритм с двумя указателями / sliding window» — в зависимости от контекста.

Прокрутить вверх