Reduzir complexidade quadrática

1 resposta
victorwss

Não sei se esse é o fórum mais adequado, mas lá vai:

Oi pessoal. Aqui no trabalho, estou desenvolvendo um framework para relacionar campos no banco de dados com métodos. O desempenho é muito ruim: O(n^2). E eu gostaria de tentar otimizar. Colocando de forma genérica, o problema pode ser dado assim:

Tenho um grupo de dados A e um grupo de dados B. Tenho uma função que relaciona A com B. Sei que cada elemento de A se relaciona com zero ou um elementos de B e cada elemento de B se relaciona com zero ou um elementos de A.

Tenho que criar um programa que gere um Map<A, B> desta relação. A solução adotada por enquanto é:

Map<A, B> mapa = ...

for (A a : grupoA) {
    for (B b : grupoB) {
        if (relacao(a, b)) {
            mapa.put(a, b);
            break; // loop interno.
        }
    }
}

return mapa;

O problema é que essa solução é muito lenta, a complexidade é O(N^2). Estava pensando se não existe um jeito de reduzir para O(n . log(n)).

Alguém tem uma idéia?

1 Resposta

peczenyj

Ao meu ver, uma fonte de problemas ai é o fato de vc verificar em TODO o grupo B sempre.

Map<A, B> mapa = ...  
   
 for (A a : grupoA) {  
     for (B b : grupoB) {  
         if (relacao(a, b)) {  
             mapa.put(a, b);  
             grupoB.remove(b); // esse cara não sera lido de novo!
             break; // loop interno.  
         }  
     }  
 }  
   
 return mapa;

Agora, sem ver a natureza da relação, fica dificil pensar num algoritmo mais interessante.

Criado 23 de fevereiro de 2008
Ultima resposta 25 de fev. de 2008
Respostas 1
Participantes 2