Jump to content

Número de Schröder


amoreto
 Share

Recommended Posts

SymKJjE.png

Se analisarmos a solução anterior verificamos que para cada produto S(i) x S(n-i-1) existe outro produto simétrico que é exatamente o mesmo, pelo que podemos calcular apenas metade dos produtos

repetidos e duplicar o seu valor de forma eficiente, usando o deslocamento (shift) para a esquerda.

Assim, é possível fazer uma implementação com aproximadamente metade das multiplicações. Tendo

isto em conta desenvolva outra função repetitiva otimizada.

Boas!

Eu fiz o código do numero de Schroder usando programação dinâmica, mas agora (não usando array) nao estou a ver como vou usar o shift, e reduzir o numero de multiplicaçoes!

Este é o meu código usando programação dinâmica(funciona), mas preciso de fazer outra funçao repetitiva optimizada como está descrito em cima!

int sd(unsigned int n)
{
int i,j,result;
int *v=malloc((n+1)*sizeof(int));

v[0]=1;

for(i=1;i<=n;i++)
{
 v[i]=0; /*coloco o array todo a zero*/

 for(j=0;j<i;j++)
    {
          v[i] += v[j] * v[i-j-1];
          count++; /*contar as multiplicaçoes*/
     }

 v[i] += v[i-1];	
}

result=v[n];
free(v);

return result;
}
Edited by amoreto
geshi
Link to comment
Share on other sites

Se analisarmos a solução anterior verificamos que para cada produto S(i) x S(n-i-1) existe outro produto simétrico que é exatamente o mesmo, pelo que podemos calcular apenas metade dos produtos

repetidos e duplicar o seu valor de forma eficiente, usando o deslocamento (shift) para a esquerda.

Assim, é possível fazer uma implementação com aproximadamente metade das multiplicações. Tendo

isto em conta desenvolva outra função repetitiva otimizada.

que solução mágica é essa ? deveria o fórum saber por magica a que se refere isso ?

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

E o que é que não entendes? Como usar o shift?

Como diz aí, usando o shift, podes multiplicar... ou seja, se fizeres shit de uma casa, multiplicas por dois, duas casas, por 4, etc, etc...

Não sei que computador tens, mas isto costuma ser possível de calcular nas calculadoras do Windows e Macosx. No windows usas a tecla Lsh em modo programador e no Macosx os <<...

Se fizeres um tracing de 4 ou 5 iterações começando em S(1), vai ser evidente onde podes multiplicar por dois (um shift para a esquerda). O problema será em indices de somatório impares já que não são tem um duplo no somatório.

Uma pequena melhoria que podes fazer no teu código é mudar o tipo de variável para unsigned int... os resultadores serão sempre positivos, logo unsigned int dar-te-á mais espaço, já que os números parecem aumentar exponencialmente.

Edited by bubulindo

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.