不変のデータ構造としてdeque(つまり、両端キュー)を実装する方法については、しばらく考えていました。
これを行うにはさまざまな方法があるようです。AFAIK、不変のデータ構造は一般に階層的であるため、アイテムの挿入や削除などの操作を変更した後、その大部分を再利用できます。
Eric Lippertのブログには、このトピックに関する2つの 記事と、C#でのサンプル実装があります。
彼の実装は両方とも、実際に必要なものよりも複雑であると私は思います。dequesは、ツリーの「左」(前面)と「右」(背面)でのみ要素を挿入または削除できるバイナリツリーとして単純に実装できませんでしたか?
o
/ \
… …
/ \
… …
/ \ / \
front --> L … … R <-- back
さらに、ツリーは回転と合理的にバランスが保たれます。
- 前部への挿入時または後部からの取り外し時の右回転、および
- 前面から取り外したり、背面に挿入したりすると、左に回転します。
エリック・リッパートは、私の意見では、私が深く尊敬している非常に賢い人ですが、彼は明らかにこのアプローチを考慮していませんでした。それで、それは正当な理由でしたか?dequesを実装するための私の提案された方法はナイーブですか?