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