Quero começar dizendo que essa NÃO é uma pergunta de lição de casa. Estou lendo Introdução aos algoritmos - o famoso texto do CLRS para se tornar um programador melhor. Estou tentando resolver os problemas e exercícios dados no livro sozinho.
Estou tentando resolver o Exercício 10.1-2 do Capítulo 10 Estruturas de dados elementares do CLRS Second Edition. Aqui está o que seus estados:
Explique como implementar duas pilhas em uma matriz A [1..n] de tal maneira que nenhuma pilha exceda o limite, a menos que o número total de elementos em ambas as pilhas juntos seja n . As operações PUSH e POP devem ser executadas no tempo O (1) .
A solução que eu encontrei até agora é:
Deixe o array A [1..n] implementar duas pilhas: S1 [1..i] e S2 [i..n] .
Para as operações PUSH-S1 e PUSH-S2 , se a pilha estiver 'cheia', comece a empurrar elementos para a outra pilha (por exemplo, se a pilha S1 estiver cheia quando um novo elemento estiver tentando ser pressionado, empurre-o para dentro pilha S2 e vice-versa).
O problema com essa abordagem é que não poderei POP-S1 ou POP-S2 de maneira confiável, pois não há como 'lembrar' qual elemento pertence a qual pilha. Se os elementos da pilha forem pares (chave, valor) , sendo a chave o número da pilha, para exibir um elemento, eu teria que pesquisar, no pior caso, i ou (ni) vezes - que será O (n ) (sinta-se à vontade para me corrigir se estiver errado aqui), o que não seria O (1) .
Eu tenho batido minha cabeça na pergunta por um bom tempo agora. Estou no caminho certo? Alguém pode dar meus possíveis ponteiros para resolver este problema?
Em geral, como devo 'pensar' sobre esses problemas? Ou apenas pessoas realmente inteligentes podem resolver esses tipos de problemas? Lidar com / resolver problemas como esses (isto é, ganhar experiência) me ajudará a melhorar nisso?
Aguardo a iluminação.