Чтобы сохранить вставки O (1) (с удалением самого старого элемента после 100) и O (1), вам понадобится класс, который реализует IDictionary , а хранит внутренний упорядоченный список. Если память больше беспокоит, реализация BST, такая как SortedList
, может быть более подходящей. В любом случае, ваш класс будет содержать T[]
и Dictionary<T,K>
(или SortedList<T,K>
). Сделайте свою собственную кольцевую буферизацию (легко), и сохраняйте обе коллекции текущими в методах добавления, удаления и т. Д. Вы получите:
- O (1) в очередь (назад)
- O (n) вставка, которая нарушает порядок добавления (так как вы должны поддерживать массив в актуальном состоянии); вам, скорее всего, это никогда не понадобится
- O (1) dequeue (спереди)
- Поиск по O (1) или O (log n)
Сделайте его универсальным и внедрите IDictionary<T,K>
и IDictionary
, так как нет причин не делать этого, и вы получите преимущество в производительности.
Одно важное соображение : что вы делаете с дубликатами ключей? Я предполагаю, что вы не можете сохранить дубликаты, поэтому:
- Бросить исключение (если никогда не бывает дубликатов ключей, поэтому просто вставить что-то дважды)
- Переместиться назад: проверьте
Count
словаря, затем вставьте ключ с помощью индексатора this[key]
. если размер увеличивается, то проверьте, имеет ли список максимальную емкость, удалите передний элемент из списка и словаря и добавьте новый элемент в конец. Если размер словаря не увеличился, переместите элемент из его существующего места в списке в конец списка.
- Перезаписать без перемещения: тоже самое, что и предыдущий элемент, но вам не нужно возиться со списком.
Наконец, обратите внимание, что во внутреннем списке хранятся ключи, а не значения. Это необходимо для обеспечения удаления O (1) при превышении емкости списка.