Pesquisar

21 de abr de 2016

Algoritmo de Concomitância de Períodos


Procurando por algoritmos sobre concomitância de períodos de datas, ou mesmo de concomitância numérica na internet, pouco achei sobre. Portanto acho que serei pioneiro na escrita sobre tal, e espero que o post possa ajudar também àqueles que trabalham desenvolvendo softwares previdenciários para calcular o tempo aproveitado de serviço para contribuição de aposentadoria.

 

 Introdução à concomitância de períodos numéricos

 

Primeiramente, o que é concomitar?
De acordo com o Dicionário inFormal online significa "V.T. Ação de produzir ou fazer várias coisas ao mesmo tempo, no mesmo momento. ". Entende-se por "período", dois números x e y, por exemplo (início e fim), capazes de gerar um conjunto numérico linear, criando então um vetor com elementos sequenciais de x até que chegue no y: {x, x+1, x+2, x+3, ... , y}.
Exemplificando: Tome como base x=2, y=6, então o conjunto de x e y será: {2, 3, 4, 5, 6}. Vamos nomear esse conjunto de "P", para entender mais à frente.

A concomitância de períodos nada mais é do que a intersecção de conjuntos numéricos, formando novos conjuntos a partir da intersecção que foi feita (se houver). Como o foco desse post visa auxiliar desenvolvedores de softwares previdenciários, a concomitância de períodos numéricos e de períodos de datas, nesse caso, funciona um pouco diferente, não sendo apenas fazer meras intersecções.



Criando Períodos Concomitantes

 

Um período "Pi" (onde i é a linha da tabela onde se encontra esse período) só concomitará com os períodos que vierem antes dele, inclusive com as datas mais antigas! Portanto se estiver trabalhando com um período onde a linha é i=3, então ele só poderá buscar concomitantes nas linhas onde i seja 2, 1 e 0

Temos então uma fórmula da Concomitância, onde P é o conjunto-período, i é a linha da tabela que está encontrado o período (como na computação os números começam a contar a partir do 0, logo, a primeira linha i será 0), e n é a quantidade de números distintos, gerados pela intersecção dos demais períodos anteriores.

Necessita de revisão (?)

Exemplificando mais, temos os seguintes Períodos:


Pi Início Fim Conjunto gerado Concomitado Qtd Ccmtd
P0 2 6 2,3,4,5,6 {} 0
P1 3 5 3,4,5 {3,4,5}3
P2 3 8 3,4,5,6,7,8 {3,4,5,6} 4
P3 2 10 2,3,4,5,6,7,8,9,10 {2,3,4,5,6,7,8} 7
P4 12 15 12,13,14,15 {} 0


Notas sobre a regra de negócio:
  • Pense no período concomitado como um "array";
  • Se os períodos estiverem desorganizados, como por exemplo o P0 tendo Início com 5 e a P1 inciar com 3, tratar de colocar o P1 antes do P0! Organizando assim os inícios dos períodos de forma crescente. Não esquecer de redefinir os períodos de P1 para P0 também.
  • Se por exemplo dois períodos iniciarem com o mesmo número, então não importa quem será o período antes de quem, não necessitando então de uma regra específica para validar isso;
  • Se não houver intersecção, então nada será concomitado, logo, a quantidade será 0;
Passo a passo para montar o algoritmo:
  1. Arrumar lista inserida pelo usuário com Período Inicial crescente;
  2. Usar 2 laços para calcular a concomitância: o primeiro com início em 0 e o término sendo igual a quantidade de linhas da tabela, e o segundo laço com início no ponteiro do primeiro laço e final em 0 (de cima para baixo);
  3. O segundo laço deve ir buscando a intersecção do conjunto da linha onde está até que chegue à linha 0, agregando todos os números que conseguir na intersecção dentro de um vetor (array).
    Se a linguagem de programação que for usada não houver funções de intersecção de arrays, então para ser feita essa etapa, provavelmente será necessária a verificação do período Pi com os períodos anteriores com estruturas de controle/fluxo (if's) e com laços dentro para criar a intersecção;
  4. Quando o vetor estiver preenchido, fazer filtro dentro desse vetor para eliminar números repetidos, então você terá o período concomitado criado pelo segundo laço;
  5. Contar a quantidade de números que tem dentro desse novo conjunto filtrado, e então esta será sua quantidade de números/dias concomitados, logo, tendo a quantidade total de números dentro período e a quantidade concomitada deste mesmo período, temos a/o quantidade/tempo aproveitado(a)! Basta realizar:

    Tempo Aproveitado = Qtd de nums do período —  Qtd nums. concomitados.
Você pode conferir um pequeno software que fiz sobre o assunto, licenciado sob à GPL v3 aqui no GitHub e ver como funciona. Note que, mesmo desorganizando a lista, o software organiza ela sozinho e depois calcula o tempo concomitante e aproveitado.

(Post em expansão)

Um comentário: