まず、これは宿題の問題ではないと言いたいです。私はアルゴリズムの紹介-優れたプログラマーになるための有名なCLRSテキストを読んでいます。私はこの本で与えられた問題と演習を自分で解決しようとしています。
私が解決しようとしているエクササイズ10.1-2をから第10章基本データ構造 CLRS第二版から。その状態は次のとおりです。
1つの配列A [1..n]に2つのスタックを実装する方法を説明します。両方のスタックの要素の合計数がnでない限り、どちらのスタックもオーバーフローしないようにします。PUSHおよびPOP操作はO(1)時間で実行する必要があります。
私がこれまでに考え出した解決策は次のとおりです。
配列A [1..n]がS1 [1..i]とS2 [i..n]の 2つのスタックを実装するようにします。
用PUSH-S1およびPUSH-S2操作、スタックが「満杯」である場合、その後に要素をプッシュスタート他のスタック(例えば、スタック場合S1は新しい要素を押し込むことしようとしているときに一杯になった後にその要素をプッシュスタックS2およびその逆)。
このアプローチの問題は、どの要素がどのスタックに属しているかを「記憶」する方法がないため、POP-S1またはPOP-S2を確実に使用できないことです。スタックの要素が(キー、値)のペアであり、キーがスタック番号である場合、要素をポップするには、最悪の場合、iまたは(ni)回-O(n )(ここで間違っている場合は、お気軽に修正してください)、これはO(1)ではありません。
私はかなり長い間質問に頭を打ち続けてきました。私は正しい軌道に乗っていますか?誰かがこの問題を解決するための私の可能なポインターを与えることができますか?
一般に、これらの問題についてどのように「考える」べきですか?または、本当に知的な人だけがこの種の問題を解決できますか?これらのような問題に取り組む/解決する(つまり、経験を積む)ことで、私はこれで良くなりますか?
悟りを待っています。