Há um programa que deve...
- Ler cada par de linhas subjacentes e computar a intersecção entre as duas listas de inteiros
- Computar a união entre todas estas intersecções.
- Escrever esta união em um arquivo
output.txt
em ordem crescente.
Input:
55,0,1,2,3,4,5,6,7,8,9,
88,0,2,4,6,8,99,
77,10,11,12,13,
99,11,13,
Output esperado:
0,2,4,6,8,11,13,
Explicação:
- A intersecção entre
55,0,1,2,3,4,5,6,7,8,9,
e88,0,2,4,6,8,99,
é0,2,4,6,8,
; - A intersecção entre
77,10,11,12,13,
e99,11,13,
é11,33,
; - A união entre
0,2,4,6,8,
e11,33,
é0,2,4,6,8,11,13,
(resposta final).
A classe que implementa este algoritmo é chamada MyProcessor
. A implementação atual usa RoaringBitmaps (docs) para fazer uniões e intersecções nos conjuntos de inteiros. (Pode-se entender que a classe RoaringBitmap
é como uma implementação de Set<Integer>
).
Há uma classe chamada TestRunner
que executa e confere que este programa funciona corretamente usando diferentes arquivos de input e output, separados por níveis de complexidade (a constante LEVEL
que assume valores de 0 até 3). O programa é rodado em loop por 5 vezes.
Preparo:
- Baixar o arquivo testcases.tar.gz e descompactá-lo na raiz deste repositório.
- Renomear a classe
MyProcessor
para{SEU_NOME}Processor
. - Usar as flags
-Xms512M -Xmx512M
na JVM ao rodar a classeTestRunner
. - Rodar a classe
TestRunner
no nível 0 (TestRunner.LEVEL = 0
) e verificar que tudo está funcionando corretamente antes da sua otimização.
Objetivo:
Otimizar o programa tanto em uso de CPU quanto de memória o máximo possível, mantendo o comportamento esperado do programa.
O resultado final deve ser medido no nível 3 do TestRunner (TestRunner.LEVEL = 3
)