Olá amigos, tudo bem com vocês?

Imagine que um belo dia você entra em sua livraria favorita e visualiza um conjunto de 6 livros dos quais você tem profundo interesse:

Livro Preço
Livro 1 R$ 100,00
Livro 2 R$ 67,00
Livro 3 R$ 300,00
Livro 4 R$ 30,00
Livro 5 R$ 50,00
Livro 6 R$ 25,00

Você tem R$ 195,00 no bolso e gostaria de levar a maior quantidade de livros possível. Como você resolveria?

Livros

Estante de livros de diversas cores

A resposta mais plausível  (comprar os Livros 2,4,5,6 cuja soma resulta em R$ 172,00 e guardar os R$ 23,00 restantes) não é tão complexa de calcular uma vez que temos um conjunto pequeno de apenas 6 livros.

Contudo para analisar um conjunto de 1 milhão de livros talvez você precise da ajuda de computador, que por sua vez vai necessitar da ajuda de algoritmo bem eficiente para realizar o trabalho.

Um desses algoritmos será o assunto do nosso artigo de hoje: Sliding Window (ou Janelas Deslizantes em português).

O Algoritmo

Para encontramos os livros que cabem do nosso orçamento, iremos comparar o preço de cada um dos livros, a partir do primeiro.

Quando o valor do orçamento for atingido, nós atualizaremos a lista de livros disponíveis e reiniciaremos a análise. Porém, nessa segunda etapa vamos iniciar a análise a partir do segundo livro da lista e o processo irá se repetir até o fim.

Veja abaixo a visualização gráfica do algoritmo sendo executado.

Inicio da execução

Na inicio de execução do algoritmo, a soma de preços está apenas como o primeiro livro: R$ 100,00 e não fizemos nenhuma aquisição de um novo livro.

Sliding Window 1

Inicio de execução. O livro de R$ 100,00 já está na sacola. O objetivo agora é adquirir os outros.

Na segunda varredura do algoritmo, adicionamos o livro de R$ 67,00. Uma vez que a soma de R$ 167,00 está dentro de nosso orçamento.

Segunda interacao

Segunda varredura e podemos verificar que o livro de 67,00 pode ser adquirido, pois R$ 167,00 ainda está no orçamento.

Na terceira  varredura ocorre nosso primeiro estouro de orçamento. O Livro de R$ 300,00 está acima do valor disponível. Portanto o algoritmo não adiciona este livro e continua a sua execução.

Terceira interação

Primeiro estouro de orçamento. Adquirir o livro de R$ 300,00 está fora de questão.

Perceba que nas próximas tentativas, o único livro que ainda tem possibilidade de entrar em nossa sacola sem estourar o orçamento é o livro de R$ 25,00. Quando isso acontece é hora de refazermos a análise, porém agora iremos começar a partir do livro de 67,00.

 Deslize da Janela

No início dessa  fase, o orçamento atinge o seu limite na segunda varredura, pois R$ 67,00 + R$ 300,00 vai ultrapassar os R$ 195,00.

Primeiro deslize

Primeiro estouro de orçamento da nova janela.

Apesar disso, obtemos sucesso em todas as outras tentativas de captura. E concluímos que esta é a melhor configuração de nossa sacola (livros de 67, 30, 50, 25 reais).

Final feliz

Configuração ideal, onde compramos uma boa quantidade de livros sem estourar o orçamento

Obs.: O algoritmo continuará executando, mas não irá encontrar outra configuração melhor.

Conclusão

Apesar de parecer simplório, este algoritmo possui diversas aplicações na Ciência da Computação.

Entre elas:

  1. Compressão de dados: Algoritmos de compressão de dados usam janelas deslizantes para encontrar padrões e repeti-los quando necessários.
  2. Processamento de imagens: Funções como detecção de objetos e segmentação de imagens podem ser executadas com o auxílio do algoritmo de janelas deslizantes.
  3. Processamento de sinais: Janelas deslizantes podem auxiliar na identificação de padrões, tendências e anomalias em processamentos de sinais.
  4. Protocolos de rede: Como já relatado no meu artigo de Back Pressure, Janelas deslizantes podem auxiliar a controlar o fluxo de dados em redes de baixa velocidade e evitar perdas de dados.

Conhecer esse algoritmo é bastante importante até mesmo para entender como outras técnicas são realizadas, com menos dificuldade de entendimento.

Nesta parte 1, utilizei uma janela deslizante de tamanho dinâmico. Na parte 2 irei abordar uma situação onde ela é fixa.

Espero que esse texto tenha sido útil para você e muito obrigado pela leitura.

Referências

https://www.geeksforgeeks.org/window-sliding-technique/

https://www.baeldung.com/cs/sliding-window-algorithm

Minha implementação de Sliding Window na Linguagem C#.Net  https://github.com/cezarantoniodevsec/roadmap_dotnet/blob/main/roadmap_dotnet/roadmap_dotnet/DataStructures/SlidingWindow/SlidingWindow.cs