Estou procurando um algoritmo on-line que utiliza um fluxo de elementos e preserva os elementos que estão na fronteira de Pareto (por exemplo, todos os elementos não dominados).
Por exemplo. Dadas as seguintes entradas, o conjunto de fronteiras retidas de Pareto evoluiria da seguinte maneira:
(3,7)
- inserir elemento b / c é o primeiro elemento
- conjunto de pareto agora inclui
{(3,7)}
(7,3)
- inserir elemento b / c não é dominado no primeiro
- conjunto de pareto agora inclui
{(3,7), (7,3)}
(8,4)
- insira o elemento b / c não é dominado; remova o
(7,3)
que é dominado em ambas as dimensões - conjunto de pareto agora inclui
{(3,7), (8,4)}
- insira o elemento b / c não é dominado; remova o
(1,1)
- não insira porque domina nas duas dimensões
- conjunto de pareto agora inclui
{(3,7), (8,4)}
(9,9)
- insira o elemento b / c não é dominado; remova todos os outros elementos porque isso os domina nas duas dimensões
- conjunto de pareto agora inclui
{(9,9)}
No meu exemplo, estou usando duas tuplas, mas estou procurando um algoritmo que possa manipular N-tuplas para N "pequeno" (digamos <10).
A solução ingênua é apenas comparar cada elemento com todos os elementos atualmente no conjunto. Na prática, a abordagem ingênua pode não ser tão ruim (por exemplo, sub) porque os elementos serão expulsos regularmente pelo conjunto de comparação. Mas eu queria saber se havia um algoritmo eficiente conhecido para isso. Estou interessado em eficiência na memória e na complexidade computacional. (Ha! E, de fato, estou procurando o conjunto de algoritmos que são ótimos de Pareto em relação à memória e à complexidade computacional.)
Minha aplicação atual disso é a construção de um documento de pesquisa LuceneCollector
que não coleta os documentos mais relevantes (o caso de uso típico de um mecanismo de pesquisa), mas coleta os documentos ideais do Pareto nas dimensões especificadas.