То, что вы сделали, в значительной степени правильный выбор.
Крутая вещь в этом заключается в том, что добавление порядка в существующую реализацию карты с использованием двустороннего двусвязного списка на самом деле не меняет его асимптотическую сложность, поскольку все соответствующие операции над списком (добавление и удаление) имеют худший результат. -сложность шага & theta; (1). (Да, удаление также является & Theta; (1). Причина, по которой обычно это & Theta; (n), заключается в том, что вам нужно найти элемент, который нужно удалить первым, то есть & Theta; (n), но фактическое удаление само по себе - это & Theta; (1). В этом конкретном случае вы позволяете карте выполнить поиск, что-то вроде & Theta; (1) амортизированной сложности шага для наихудшего случая или & Theta; (log b & thinsp; n) сложность шага наихудшего случая в зависимости от типа используемой реализации карты.)
Класс Hash
в Ruby 1.9, например, является упорядоченной картой и реализован, по крайней мере, в YARV и Rubinius в виде хеш-таблицы, встроенной в связанный список.
Деревья, как правило, имеют сложность шага в наихудшем случае & Theta; (log b & thinsp; n) для произвольного доступа, тогда как хеш-таблицы могут быть хуже в худшем случае (& Theta; (n)), но обычно амортизируйте & theta; (1), если вы не испортили хеш-функцию или функцию изменения размера.
[Примечание: я намеренно говорю только об асимптотическом поведении, то есть «бесконечно больших» коллекциях. Если ваши коллекции маленькие, просто выберите коллекцию с наименьшими постоянными коэффициентами.]