2015-12-23 2 views
0

Я реализую очередь MinMax Priority Queue на std :: multimap с возможностью иметь несколько значений на ключе, и у меня уже есть функции minKey и maxKey, написанные в O (1) временная сложность (с использованием begin() и end()).Реализация MinMax PriorityQueue с minValue и maxValue в O (1)

Теперь у меня есть проблема с реализацией minValue и maxValue. Одним из очевидных решений было бы создание структуры данных (например, с помощью std :: set) с помощью только значений этого pqueue и доступа к min и max в O (1).

Очевидно, что недостатком этого решения будет дублированный объем памяти, который я, конечно, не хочу.

Я думаю о решении с указателями на minValue и maxValue соответственно. Вставка в PQ будет простой, просто сравните с этими указателями ... теперь, что насчет удаления?

Вставка: Я могу иметь несколько значений на определенном ключевом

Удаление: Стирает любое значение из определенного ключа (если ключ не существует, генерируется исключение).

Есть ли у вас какие-либо предложения о том, как реализовать minValue и maxValue в O (1) сложности времени?

Заранее спасибо

+0

C не имеет 'std :: multimap' или' std :: set'. Тег кажется несущественным для вашего вопроса. Почему вы его добавили? – user2079303

+0

Итак, функция 'minValue' должна возвращать наименьшее значение на карте, а не значение в самом маленьком ключе? – user2079303

+0

У C++ уже есть 'priority_queue' в STL. Какую дополнительную функциональность вы хотите от этого? –

ответ

0

Давайте резюмировать то, что вы хотите. Вы хотите реализовать двойную очередь приоритетов для пар ключ-значение, которые должны сортироваться в соответствии с двумя различными функциями сравнения. Один, который сравнивает ключевую часть пары и сравнивает значение-часть.

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

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

Если вы чертовски настроены в своем дизайне с несколькими сравнениями, то то, что вы могли бы использовать для реализации очереди, - это контейнер с несколькими индексами. Boost имеет библиотеку таких контейнеров.

+0

Хм, я думаю, что использование std :: multimap + std :: set было бы лучшим вариантом.в multimap я бы просто хранили , а в std :: set я бы сохранил только V. Таким образом, ни одна из данных не дублируется, и у меня есть постоянный доступ к minValue и maxValue. – astose

+0

Это не позволит вам найти, что является ключом минимального значения. Если вам это не нужно, тогда придумайте. – user2079303

+0

Мне это не нужно. Теперь у меня проблема с конструктором копирования, потому что она должна быть в [O (queue.size())] временной сложности, поэтому я не могу использовать ни вставку, ни поиск. Оператор = для мультимапа даст мне указатели на исходные значения (не скопированные). Возможно, у вас есть идея о том, как это сделать? – astose

Смежные вопросы