2009-03-02 7 views
2

Java priority queue - это структура данных с сложностью для ввода (вставки) O(log n) и O(log n) для опроса (поиск и удаление элемента min).Очередь приоритетов Java

C++ STL multimap имеет ту же функциональность, но O(1) сложность для извлечения и удаления элемента min (начало и стирание). Есть ли эквивалент в Java?

+1

Не могли бы вы объяснить, как очередь может быть мультимапом? Первый имеет один параметр типа, а второй - два. –

+0

Использовать Void как параметр второго типа? –

+0

Вам нужно использовать пользовательский оператор <для типа, если используется priority_queue. Смотрите здесь http://www.google.com/codesearch/p?hl=ru#GBlGDoDYBC4/Maude-2.2/src/ObjectSystem/pseudoThread.hh&q=priority_queue –

ответ

2

Google Collections обеспечивает реализацию Multimap. В частности, TreeMultimap может использовать компараторы для сортировки на основе любых ключей, значений или обоих.

+0

Google Multimaps не поддерживают порядок ключей, что кажется подразумевается для C++ один, правильно? –

+0

Я обновил свой ответ, чтобы обратиться к TreeMultimap – Mark

0

std:multimap будет древовидной структурой, что означает, что добавление и удаление вместе будет O (log n).

+0

добавить и удалить O (1) амортизируется. –

+0

O (1) для хэш-структуры. Но для дерева? –

1

Во-первых, я бы проверял, что мультимап на C++ действительно дает O (1) для , удаляя элемент min. Наиболее распространенными структурами для sotred maps/priority queues являются древовидные структуры, в которых , запрашивающий, элемент min имеет сложность O (1), но удаление это O (log n).

То есть, я думаю, что список пропуска (реализуемые в Java ConcurrentSkipListMap) может дать вам O (1) для удаления минимального элемента, но я не совсем уверен. Одной из проблем при оценке производительности ConcurrentSkipListMap является то, что операции обхода «убирают» маркеры, оставленные предыдущими удалениями. Таким образом, сложность операции может фактически зависеть от предыдущих операций. (С другой стороны, на каком-то уровне это справедливо в отношении любого алгоритма: будут ли некоторые данные в кэше ЦП могут зависеть от того, поставила ли его предыдущая операция ...)

P.S. Забыл сказать: посмотрите на ConcurrentSkipListMap.pollFirstEntry().

+0

стирание мультимапа (итератор x) амортизируется постоянным, так что да, это так. По умолчанию pop_queue - O (log N). –

+0

Грег - знаете, какую структуру они используют для этого? –