ep3 dúvida

ep3 dúvida

por Alessandro Bezerra da Silva -
Número de respostas: 3

Na especificação diz

"No arquivo esqueleto Arrangements.java há um unit test que mostra o comportamento esperado da sua classe. O iterador deverá retornar os arranjos da string s em ordem lexicográfica. O consumo de espaço do iterador deve se proporcional ao número n de caracteres na string s."

 Não entendi o que significa 'ser proporcional ao número n'. Estava pensando em gerar todas as permutações logo de cara e depois ir imprimindo elas na tela, conforme o caso, tudo guardado num vetorzão. Então essa ideia está ruim? deve-se gerar as permutações na hora? como que é o negócio...?

Em resposta à Alessandro Bezerra da Silva

Re: ep3 dúvida

por José Coelho de Pina -

Oi Alessandro,

Muito obrigado pela sua pergunta. Ela vai ajudar a esclarecer várias coisas.

Não entendi o que significa 'ser proporcional ao número n'.

Primeiro, proporcional significa que o número N de bytes usados pelo seu programa devem ser algo da forma cn, para alguma constante c.

Por exemplo, é aceitável que tenhamos N aproximadamente 3.2 n, N aproximadamente 4n, N aproximadamente 17n.

Na prática, isso significa que você pode usar no seu programa vetores com n, ou 2n posições,... É evidente que cada posição de um tal vetor deve usar um número constante de bytes, 8 por exemplo.

Estava pensando em gerar todas as permutações logo de cara ...

O espaço para armazenar essas permutações é proporcional a 2n que é muito maior que cn.

Uma das ideias bacanas ligadas ao conceito de iteradores é não estourarmos o programa usando espaço para armazernar todos os objetos de algum conjunto potencialmente muito grande.

Iteradores são mecanismos que nos permitem examinarmos itens de um conjunto muito grande sem explodirmos com a memória. Para isso precisamos gerar os itens um após o outro, em alguma ordem,  sem armazenar os itens antecessores.

Então essa ideia está ruim?

É uma boa ideia para começar e depois ser refinada.

deve-se gerar as permutações na hora?

Cada permutação deve ser gerada apenas quando for solicitada através de next().
Para isso o iterador deve guardar um certo contexto (não sei se esse é um termo apropriado).

Valeu!

P.S. Em um dos próximos EPs, talvez o EP06, vocês terão que examinar (alguns) elementos de um conjunto absurdamente grande.
Para essa tarefa será fundamental gerar elementos do conjunto de uma maneira económica.
Não há a menor chance de armazenarmos todos os elementos.

Em resposta à José Coelho de Pina

Re: ep3 dúvida

por Alessandro Bezerra da Silva -

prof, valeu pelos esclarecimentos.

uma curiosidade: o algoritmo que vcs implementaram na solução, para gerar as permutações "na hora" é iterativo, não é? 

Em resposta à Alessandro Bezerra da Silva

Re: ep3 dúvida

por José Coelho de Pina -

Oi Alessandro,

Desculpe pela demora.

o algoritmo que vcs implementaram na solução, para gerar as permutações "na hora" é iterativo, não é?

Sim.
Ele pode até ser inspirado em um método recursiva, que pode ter sido transformado em iterativo através de simulação da pilha da recursão.
O iterador necessita guardar o contexto das váriáveis quando uma permutação foi gerada para, depois de uma nova chamada de next() retomar a computação a partir do ponto que havia parado.