Задать вопрос
begemot_sun
@begemot_sun
Программист в душе.

Структура данных типа очереди, позволяющая быстро определить позицию элемента. Есть?

Положим есть у меня большой список элементов (уникальных строк).
В него элементы могут добавляться в конец, перемещаться внутри этого списка (не обмениваться), и удаляться из начала.

Может знаете такую структуру данных, которая позволит мне быстро (без перебора всего списка) по элементу определить номер его позиции в таком списке, такая структура ДОЛЖНА позволять быстро перемещать элементы (с обсчетом измененых позиций других элементов).

Кол-во элементов порядка 5 млн.

Идеальный вариант когда:

Время добавления в хвост: O(1)
Время получения из головы: O(1)
Время определения позиции: O(1) или O(log n)
Время перемещения одного элемента из конца в начало: O(log n) или O(1)

Приветствую любые ссылки. Спасибо.
  • Вопрос задан
  • 383 просмотра
Подписаться 3 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 2
@mickvav
Programmer, system and network administrator
Если элементы внутри нужно уметь только парами менять местами и есть разумная оценка на объем - кольцевой буффер.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Очередь, физически не перемещающая элементы (кольцевая или некое подобие std::deque) и позволяющая по указателю быстро определить позицию.

Плюс любой индекс (хэш- или деревянный), элементы которого — указатели на элементы очереди. Если элементы очереди unique_ptr, то указатели будут именно на unique_ptr! Для «мусорных» языков (C#, Java) вместо указателей можно придумать какие-то идентификационные коды — например, сочетание из номера в пуле массивов и номера в массиве.

Enqueue — вписываем элемент в индекс. Dequeue — удаляем из индекса. Обмен позициями — корректируем эти два элемента индекса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы