При решении задачи геометрии я столкнулся с подходом, называемым алгоритмом скользящего окна.
Не удалось найти какой-либо учебный материал/детали.
Что такое алгоритм?
При решении задачи геометрии я столкнулся с подходом, называемым алгоритмом скользящего окна.
Не удалось найти какой-либо учебный материал/детали.
Что такое алгоритм?
В общем случае скользящее окно представляет собой под-список, который выполняется над базовой коллекцией. 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]
Это полезно, если вы, например, хотите вычислить текущее среднее значение, или если вы хотите создать набор всех смежных пар и т.д.
Скользящее окно - это метод решения проблем, включающий массивы/списки. Эти проблемы легко решить, используя метод грубой силы в O (n ^ 2) или O (n ^ 3). Используя метод "скользящего окна", мы можем уменьшить сложность времени до O (n).
Отличная статья об этом здесь: https://medium.com/outco/how-to-solve-sliding-window-problems-28d67601a66
Итак, первое, что вы хотите сделать, это определить проблему который использует парадигму скользящего окна. К счастью, есть некоторые общие Дешевые распродажи:
Проблема будет включать структуру данных, которая упорядочена и повторяется как массив или строка
Вы ищете какой-то поддиапазон в этом массиве/строке, например, самое длинное, самое короткое или целевое значение.
Существует очевидное наивное или грубое решение, которое работает в O (N²), O (2 ^ N) или в другой большой временной сложности.
Но самое главное, что вы ищете, это часто какой-то оптимальный, например, самая длинная последовательность или самая короткая последовательность чего-то, что точно удовлетворяет данному условию.
Это хорошее введение в проблемы со скольжением окон для тех, кто заинтересован - как решить проблемы со скольжением окон
Это код протокола скользящего окна для массива размера 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]);
}
}
}