Задать вопрос
@SergeySerge11

Какая структура данных лучше подойдет для случайного удаления из коллекции?

В общем частенько заметил, трачу время на кривые велосипеды.
Есть ли оригинальное решение для такой задачи.
Нужна структура данных, в которую:
- Идут запросы на вставку с случайным ключом.
- Идут запросы на удаления, при том без ключа. Просто какой-то узел удалить.

Какое-то дерево скорей всего должно быть с узлами, а как удалить случ. узел
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Обычно во всяких кешах удаляют не случайный элемент, а какой-то особенный. Например, самый старый. Или как можно реже использующийся.

Но если вам действительно надо удалять случайный, то надо объединить две структуры. Какое-то дерево или хеш таблицу, собственно, для зранения элементов пл ключам, и вектор для хранения ключей. С помощью вектора вы и сможете быстро искать случайный ключ. В дереве кроме значения по ключу храните еще и где в векторе лежит ключ данного элемента.

При вставке - просто добавляйте в вектор ключ и вставляйте в дерево значение {значение, последний индекс в векторе}. При удалении по ключу - в известном месте вектора пропишите последний элемент и укоротите вектор на 1. Не забудьте обновить ссылку на вектор у того ключа, который с последнего места переехал.

Или можно вместе с вектором поддерживать список пустых мест в векторе. Тогда при удалении не надо перемещать ключ и обновлять ссылку, а при добавлении не расширяйте вектор, если есть пустые места.

При удалении случайного - берите случайный ключ из вектора и его удаляйте.
Ответ написан
Комментировать
dollar
@dollar
Делай добро и бросай его в воду.
Удаление без ключа - это как вообще? Как структура узнает, что именно удалять? Что-то же должно быть ключом, аргументом функции удаления! То есть "какой-то узел" должен содержать какие-то свойства, по которым происходит идентификация, хотя бы иметь адрес в памяти, и вот тогда этот адрес уже можно считать ключом.

Честно говоря, не понятно, зачем вообще ключ (из вопроса), если он не используется. Складывается ощущение, что нужно не подстраиваться под эти условия, а менять их.

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

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

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