Скажем, у нас есть строка символов (скажем, их значения указаны в диапазоне 0--255
для ASCII и диапазоне 0--65,535
).Структура данных для сохранения наименьших значений в строке
Вот список задач может быть применен:
- отслеживает показатели каждого уникального характера (последние один);
- получить символ с наименьшим
index
; - обновите структуру данных (удалите тот, который был возвращен в 2, и добавьте новый).
Вот пример, а индекс я идет от 0 до 17
aabbaaaacccddccccc
мы можем отслеживать строку онлайн, как это, где целое число в скобках является индексом соответствующий характер:
- а (0)
- а (1) б (2)
- а (1) б (3)
- ...
- а (7) б (3)
- а (7) б (3) с (8)
- ...
- a (7) b (3) c (10) Теперь мы читаем символ 'd', и нам нужно обновить структуру данных с помощью правила, скажем, удалить элемент с наименьшим индексом: b (3) и добавить д (11)
- а (7) д (11) с (10)
- ...
Мы можем использовать HashMap для отслеживания показателей каждого уникального характера:
Map<Character, Integer> myMap = new HashMap<>(m);
myMap.put(new Character(input.charAt(j)), j);
Но когда мы хотим получить символ с наименьшим индексом, мы можем пройти через карту один-на-один, который не так эффективен, как я хотел.
Мы можем использовать приоритетную очередь для хранения элементов, что дало мне время O (1) для получения наименьшего элемента; но я не могу обновить очередь приоритетов так же, как и карту.
Есть идеи?
Еще одна проблема с TreeMap: Map myMap = new HashMap <> (m); TreeMap sortedMap = new TreeMap <>(); Все пары (ключ, значение) добавляются в myMap выше и все пары (значение, ключ) добавляются в отсортированную карту выше. Спасибо. –
user2646171