Что такое алгоритм раздвижного окна? Примеры?

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

Не удалось найти какой-либо учебный материал/детали.

Что такое алгоритм?

Ответ 1

В общем случае скользящее окно представляет собой под-список, который выполняется над базовой коллекцией. I.e., если у вас есть массив вроде

[a b c d e f g h]

скользящее окно размером 3 будет работать над ним, как

[a b c]
  [b c d]
    [c d e]
      [d e f]
        [e f g]
          [f g h]

Это полезно, если вы, например, хотите вычислить текущее среднее значение, или если вы хотите создать набор всех смежных пар и т.д.

Ответ 2

Скользящее окно - это метод решения проблем, включающий массивы/списки. Эти проблемы легко решить, используя метод грубой силы в O (n ^ 2) или O (n ^ 3). Используя метод "скользящего окна", мы можем уменьшить сложность времени до O (n).

Отличная статья об этом здесь: https://medium.com/outco/how-to-solve-sliding-window-problems-28d67601a66

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

  • Проблема будет включать структуру данных, которая упорядочена и повторяется как массив или строка

  • Вы ищете какой-то поддиапазон в этом массиве/строке, например, самое длинное, самое короткое или целевое значение.

  • Существует очевидное наивное или грубое решение, которое работает в O (N²), O (2 ^ N) или в другой большой временной сложности.

Но самое главное, что вы ищете, это часто какой-то оптимальный, например, самая длинная последовательность или самая короткая последовательность чего-то, что точно удовлетворяет данному условию.

Ответ 4

Это код протокола скользящего окна для массива размера n, где сумма чисел k хранится вместе в другой сумме массива. Следующий код написан на Java.

import java.io.*;
class deva
{
    public static void main(String args[])throws IOException
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(in.readLine());
        int[] a = new int[n];
        for(int i=0; i<n; i++)
            a[i] = Integer.parseInt(in.readLine());
        int k = Integer.parseInt(in.readLine());
        int[] sum = new int[n-k+1];
        for(int i=0; i<k; i++)
            sum[0] += a[i];
        System.out.println(sum[0]);
        for(int i=1; i<n-k+1; i++)
        {
            sum[i] = sum[i-1] + a[i+k-1] - a[i-1];
            System.out.println(sum[i]);
        }
    }
}