Во-первых, я бы проверял, что мультимап на C++ действительно дает O (1) для , удаляя элемент min. Наиболее распространенными структурами для sotred maps/priority queues являются древовидные структуры, в которых , запрашивающий, элемент min имеет сложность O (1), но удаление это O (log n).
То есть, я думаю, что список пропуска (реализуемые в Java ConcurrentSkipListMap) может дать вам O (1) для удаления минимального элемента, но я не совсем уверен. Одной из проблем при оценке производительности ConcurrentSkipListMap является то, что операции обхода «убирают» маркеры, оставленные предыдущими удалениями. Таким образом, сложность операции может фактически зависеть от предыдущих операций. (С другой стороны, на каком-то уровне это справедливо в отношении любого алгоритма: будут ли некоторые данные в кэше ЦП могут зависеть от того, поставила ли его предыдущая операция ...)
P.S. Забыл сказать: посмотрите на ConcurrentSkipListMap.pollFirstEntry().
Не могли бы вы объяснить, как очередь может быть мультимапом? Первый имеет один параметр типа, а второй - два. –
Использовать Void как параметр второго типа? –
Вам нужно использовать пользовательский оператор <для типа, если используется priority_queue. Смотрите здесь http://www.google.com/codesearch/p?hl=ru#GBlGDoDYBC4/Maude-2.2/src/ObjectSystem/pseudoThread.hh&q=priority_queue –