Melhor desempenho no algoritimo!

12 respostas
guisantogui

Gente tenho um trabalho da facul!

e em um metodo auxiliar que desenvolvi para somar numeros menores que um outro, consegui chegar a uma formula, mas axo q meu compilador enlouqueceu, podem dar uma olhada pra mim! :wink:

metodo com laço!

public int somaMen(int i){
        int menores = 0;
        for(int j = 0; j < i; j++){      
            menores += j;
        }
        return menores;
    }

metodo com formula matematica!

public int somaMen(int i){
      return ((i+1)*i)/2;
}

12 Respostas

dyorgio

Faltou um <= no seu laço…

assim:

public  static int somaMen(int i){  
        int menores = 0;  
        for(int j = 0; j <= i; j++){        
            menores += j;  
        }  
        return menores;  
    }

e quanto ao compilador…vc esta tentando colocar 2 metodos iguais na mesma classe?
isso não pode, pelo menos o tipo de entrada/retorno tem que ser diferentes
ou muda o nome de um deles.

guisantogui

Naum naum, eu apaguei um e coloquei o outro! :smiley:

Felagund

vc pode usar recursividade

[code]
public int somaMen(int i){
if(i == 0){
return 0;
}
return i+somaMen(i-1);
}
[\code]

guisantogui

boa ideia naum tinha pensado nisso!

ViniGodoy

E que tal usar a fórmula da soma dos termos de uma PA?

public  static  int somaMen(int i){    
   int a1 = 1;
   int an = i-1;
   int n = an - a1;

   return ((a1 + an) * n) / 2;
}

Não tem como ser mais eficiente do que isso. Pode ter 1000000 de números, que o tempo continuará sendo O(1).

guisantogui

vou dar uma olhada, brigado pela ajuda!

depois tenho um mais complexo para vcs!
rrrsrsrsrsr

mas to sem tempo agora!

sergiotaborda

guisantogui:
Gente tenho um trabalho da facul!

e em um metodo auxiliar que desenvolvi para somar numeros menores que um outro, consegui chegar a uma formula, mas axo q meu compilador enlouqueceu, podem dar uma olhada pra mim! :wink:

public int somaMen(int i){

return ((i+1)*i)/2;

}

[/code]</blockquote>

não entendi o seu problema. O método matemático é o melhor, mais simples e rápido. O método com laço é pior que esse e o método recursivo é o pior de todos.

guisantogui

jah resolvi, obrigado sergio!

se tiverem material de como otimizar os algoritimos podem postar! :smiley:

marcelo.bellissimo

sergiotaborda:
guisantogui:
Gente tenho um trabalho da facul!

e em um metodo auxiliar que desenvolvi para somar numeros menores que um outro, consegui chegar a uma formula, mas axo q meu compilador enlouqueceu, podem dar uma olhada pra mim! :wink:

public int somaMen(int i){

return ((i+1)*i)/2;

}

[/code]</blockquote>

não entendi o seu problema. O método matemático é o melhor, mais simples e rápido. O método com laço é pior que esse e o método recursivo é o pior de todos.

Dá até stackOverflow dependendo do caso…

guisantogui
ViniGodoy:
E que tal usar a fórmula da soma dos termos de uma PA?
public  static  int somaMen(int i){    
   int a1 = 1;
   int an = i-1;
   int n = an - a1;

   return ((a1 + an) * n) / 2;
}

Não tem como ser mais eficiente do que isso. Pode ter 1000000 de números, que o tempo continuará sendo O(1).

1000000?

bom eu preciso de um q vah a

400000000!
:?

ViniGodoy

Esse aí vai até 4 bilhões. Troque por long e você terá uma quantidade muitíssimo maior. E detalhe, sem aumentar o tempo que se leva para fazer o calculo (já que resolver a fórmula é ridiculamente rápido).

No caso do for, você terá um aumento de tempo linear, o que chamamos de O(N). Haverá um cálculo a mais para cada número a mais na sequência.

No caso da recursividade, a situação é a mesma, tempo de O(N). Entretanto, o tempo de cálculo para cada elemento é maior do que no caso do for, sem falar que consome mais recursos (como o de pilha, que certamente estoura para programas maiores).

Já que você está falando em performance, leia esse post aqui:
http://www.guj.com.br/posts/list/15/31346.java#989991

guisantogui

Esse aí vai até 4 bilhões. Troque por long e você terá uma quantidade muitíssimo maior.

Soh posso usar int no algoritimo, mas se vai a 4 bilhoes funciona correto?

Criado 19 de março de 2010
Ultima resposta 19 de mar. de 2010
Respostas 12
Participantes 6