Translate

Mostrar mensagens com a etiqueta Prefix Sum. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Prefix Sum. Mostrar todas as mensagens

terça-feira, 25 de fevereiro de 2020

☕💥 Os 10 Padrões Secretos de Arrays em COBOL Mainframe

 

Bellacosa Mainframe e 10 padroes secretos de arrays

☕💥 Os 10 Padrões Secretos de Arrays em COBOL Mainframe

Ou como descobrir que você já usava algoritmos de entrevistas do LeetCode muito antes deles virarem moda



Introdução

Existe uma curiosidade engraçada no mundo da programação.

Um desenvolvedor Java estuda LeetCode.

Um desenvolvedor Python assiste vídeos sobre algoritmos.

Um engenheiro C++ compra livros de Competitive Programming.

Enquanto isso...

Um programador COBOL de banco com vinte anos de experiência está processando 300 milhões de registros no Batch Noturno utilizando exatamente os mesmos algoritmos...

Mas chama tudo de:

"andar na tabela"

"fazer acumulado"

"pesquisa binária"

"comparar dois índices"

"janela de análise"

E provavelmente faz isso tomando café às 3 da manhã olhando um SDSF.

A verdade é que muitos dos algoritmos mais famosos ensinados atualmente em universidades e plataformas de entrevistas já existem no universo COBOL há décadas.

OCCURS.

INDEXED BY.

SEARCH.

SEARCH ALL.

SET UP.

SET DOWN.

ASCENDING KEY.

Tabelas auxiliares.

Acumuladores.

Áreas de trabalho.

Tudo isso forma um verdadeiro arsenal de algoritmos.

E hoje vamos conhecer os 10 padrões clássicos de Arrays, explicados para um Padawan COBOL.


Padrão 1 — Two Pointers

Os Dois Jedi da Tabela

É provavelmente o algoritmo mais antigo do mundo corporativo.

A ideia é simples.

Utilizamos dois ponteiros.

Um na esquerda.

Outro na direita.

Ou ambos andando em velocidades diferentes.


Exemplo

Verificar se uma tabela é simétrica.

01 TAB.

   05 ITEM OCCURS 100 TIMES
      INDEXED BY IDX1 IDX2.

77 MAX PIC 999 VALUE 100.



SET IDX1 TO 1
SET IDX2 TO MAX



PERFORM UNTIL IDX1 >= IDX2


   IF ITEM(IDX1) NOT = ITEM(IDX2)

      DISPLAY 'NAO SIMETRICO'

   END-IF


   SET IDX1 UP BY 1
   SET IDX2 DOWN BY 1


END-PERFORM

Onde aparece?

Remover duplicidade

Palíndromo

Conciliação bancária

Arquivos ordenados

Merge VSAM

Join Batch


Complexidade

O(n)


Padrão 2 — Sliding Window

A Janela Deslizante

Esse algoritmo parece sofisticado.

Mas todo programador financeiro já utilizou.


Exemplo

Últimos 30 dias.

Tabela

10
20
15
40
50

Janela

3


Primeira

10 20 15

Soma

45


Move.

20 15 40

75


Move.

15 40 50

105


COBOL


ADD ENTRADA(I)
TO SOMA


SUBTRACT ENTRADA(I-3)

FROM SOMA

Muito usado em:

Detecção fraude

PIX

Cartão crédito

Médias móveis

SMF


Complexidade

O(n)


Padrão 3 — Prefix Sum

O Acumulador Supremo

Padawan.

Você provavelmente já usou.

Só não sabia o nome.


Exemplo.

Tabela.

5 3 2 4 1

Prefix.

5

8

10

14

15

Consultar.

Posição.

2 até 5.

15 - 5

10


COBOL

ADD VALOR(I)

TO ACUM(I-1)

GIVING ACUM(I)

Utilização.

Analytics

DW

RMF

SMF

Cobrança


Padrão 4 — Kadane

O Santo Graal das Séries

Maior sequência positiva.


Exemplo.

-2
1
-3
4
-1
2
1

Resultado.

6


COBOL

IF SOMA < ZERO

MOVE ZERO TO SOMA

END-IF

Aplicações.

Lucro máximo

Oscilações

Bolsa

PIX

Cartões


Complexidade.

O(n)


Padrão 5 — Merge Intervals

Fundindo Períodos

Muito usado.

Principalmente bancos.


Exemplo.

Cliente bloqueado.

01-05

03-10

12-20

Resultado.

01-10

12-20


COBOL

Comparar.

Datas.

Mesclar.


Usado.

Seguros

RH

Férias

Janelas batch


Padrão 6 — Cyclic Sort

A Ordem Cósmica

Pouco conhecido.

Mas genial.


Exemplo.

3 1 2

Cada número.

Vai para posição.

Correta.


Resultado.

1 2 3

Muito útil.

Detectar.

Ausentes.

Duplicados.


Padrão 7 — Hashing

O Cache Jedi


Python

Dict


Java

HashMap


COBOL

Tabela OCCURS


Exemplo.

Estados.

SP


RJ


MG

Pesquisar.

Instantaneamente.


Alternativa.

SEARCH ALL


Exemplo.

Tabela IR.

Códigos.

CEP.

Produtos.


Padrão 8 — Binary Search

SEARCH ALL

A arma secreta do COBOL.


Tabela ordenada.

SEARCH ALL CLIENTE

Complexidade.

O(log n)


1000000 registros.

Comparações.

20


Magia matemática.


Muito superior.

SEARCH.


SEARCH.

500 mil leituras.


SEARCH ALL.


Padrão 9 — Monotonic Stack

O Mestre Esquecido


Pouco usado.

Mas poderoso.


Encontrar.

Próximo maior.

Próximo menor.


Exemplo.

Temperaturas.

30

31

28

35

Pergunta.

Quando esquenta?


Em COBOL.

Pode ser implementado.

Com tabela OCCURS.


Muito usado.

Forecast.

Analytics.

IA.


Padrão 10 — Two Heaps

O Conselho Jedi

Min Heap.

Max Heap.


Encontrar.

Top 10.

Maior.

Menor.

Mediana.


Em COBOL.

Mais raro.

Mas possível.


Exemplo.

Ranking clientes.


SEARCH versus SEARCH ALL

Padawan.

Essa é importante.


SEARCH

Linear.

O(n)

SEARCH ALL

O(log n)

1000000 registros.

SEARCH.

500000 leituras.

SEARCH ALL.


INDEX versus Subscript

Subscript.

CLIENTE(I)

Índice.

INDEXED BY IDX

Mais rápido.


Menos cálculos.


Melhor cache.


SSRANGE

O Guardião das Tabelas

Sempre.

DEV.

TESTE.

QA.


Nunca acessar.

CLIENTE(1001)

Se existem.


SSRANGE salva vidas.


Quando usar DB2

Tabela enorme.

Não use OCCURS.


Quando usar OCCURS

Lookup.

UF.

IR.

CEP.

Parâmetros.

Cache.


Arquitetura Moderna

Hoje.

Programadores resolvem LeetCode.


Veteranos Mainframe.

Já faziam isso.

Em 1982.


Usando.

COBOL

VSAM

JCL

DFSORT

ICETOOL

DB2


Curiosidade Histórica

Década de 70.

IBM chamava isso.

Table Processing


Década de 80.

Performance Tuning.


Década de 90.

Binary Search.

Virou padrão.

Grandes bancos.


Década de 2000.

Java descobriu.

Collections.


Década de 2020.

LeetCode descobriu.


Década de 2030.

IA vai descobrir.

Que um programador COBOL aposentado em Campinas ou Itatiba já utilizava Prefix Sum desde 1989.


Easter Egg Bellacosa

Existe uma antiga profecia dos Sysprogs.

Ela diz:

"Chegará um dia em que um desenvolvedor júnior perguntará ao arquiteto qual algoritmo usar."

O arquiteto responderá:

Use Sliding Window.

O desenvolvedor pesquisará durante três horas.

Assistirá quatro vídeos.

Lerá cinco artigos.

Abrirá o ChatGPT.

Fará benchmarking.

Criará um POC.

E finalmente implementará.

Enquanto isso, um programador COBOL veterano sentado ao lado apenas dirá:

Ah...

Você queria uma média móvel.

Faço isso desde 1993.

Está no PROGFINC.

Linha 287.

Não mexe.

Funciona.

E agora pega um café.

Porque no Reino do Mainframe, muitas vezes os algoritmos mais modernos apenas receberam nomes mais bonitos para técnicas que os Cavaleiros COBOL já dominavam há décadas.