2つのスタックは、1つの固定サイズの配列を使用して効率的に実装できます。スタック#1は左端から始まり、右に向かって成長し、スタック#2は右端から始まり、左に向かって成長します。3つのスタックで同じことは可能ですか?
より具体的には、次の条件を前提として、3つのスタックを実装することは可能ですか?
- N個のオブジェクトを保持できる固定サイズの配列があります。
- 3つのスタックサイズの合計が<Nである限り、push()は失敗しません。
- push()とpop()の両方の操作にO(1)時間かかるはずです。
- 配列に加えて、O(1)の追加スペースのみを使用できます。
これらの要件を満たさないソリューションの例を次に示します。
- 配列を3つの固定部分に分割し、各部分をスタックに使用する(違反2)。
- 上記と同様ですが、スタック間の境界が移動可能です(違反3)。
- 単純なリンクリストベースの実装(違反4)。
それらがすべての条件(1)〜(4)を正確に満たしていない場合でも、自明ではないアルゴリズムまたは不可能性の証明を受け入れます。たとえば、プッシュ/ポップがO(1)の償却時間をとるアルゴリズム、または追加メモリはO(N)よりも小さい(例:O(log N))。または、たとえば、プッシュ/ポップごとに配列の5未満の要素にアクセスすることは不可能であることを示す不可能性の証明。