Я уже некоторое время размышлял о том, как перейти к реализации детекса (то есть очереди с двойным завершением) в качестве неизменяемой структуры данных.
Кажется, есть разные способы сделать это. AFAIK, неизменные структуры данных, как правило, иерархические, так что основные части могут быть повторно использованы после модификации операций, таких как вставка или удаление элемента.
Эрик Липперт два статьи на его блог об этой теме, а также примеры реализации на С#.
Оба из его реализаций находят меня более сложным, чем на самом деле необходимо. Не могут ли требования deques быть реализованы как двоичные деревья, где элементы могут быть вставлены или удалены только на самом "левом" (переднем) и на самом "правом" (обратном) дереве?
o
/ \
… …
/ \
… …
/ \ / \
front --> L … … R <-- back
Кроме того, дерево было бы сбалансированным с вращением:
- правые вращения при вставке спереди или при удалении со спины и
- левое вращение при удалении спереди или вставке сзади.
Эрик Липперт, на мой взгляд, очень умный человек, которого я глубоко уважаю, но он, по-видимому, не рассматривал этот подход. Поэтому я думаю, это было по уважительной причине? Является ли мой предложенный способ реализации недостатков наивным?