Приоритетная очередь
В информатике очередь с приоритетами — это абстрактный тип данных, аналогичный абстрактному типу данных обычной очереди или стека . Каждый элемент в приоритетной очереди имеет связанный с ним приоритет. В очереди с приоритетом элементы с высоким приоритетом обслуживаются раньше элементов с низким приоритетом. В некоторых реализациях, если два элемента имеют одинаковый приоритет, они обслуживаются в том же порядке, в котором они были поставлены в очередь. В других реализациях порядок элементов с одинаковым приоритетом не определен.
Хотя очереди с приоритетами часто реализуются с использованием куч , они концептуально отличаются от куч. Очередь с приоритетами — это абстрактный тип данных, такой как список или карта ; точно так же, как список может быть реализован с помощью связанного списка или массива , очередь с приоритетами может быть реализована с помощью кучи или другого метода, например упорядоченного массива.
Операции
[ редактировать ]Очередь с приоритетом должна поддерживать как минимум следующие операции:
- is_empty : проверяет, нет ли в очереди элементов.
- Insert_with_priority : добавить элемент в очередь с соответствующим приоритетом.
- pull_highest_priority_element : удалить из очереди элемент, имеющий наивысший приоритет , и вернуть его.
- Это также известно как « pop_element(Off) », « get_maximum_element » или « get_front(most)_element ».
- Некоторые соглашения меняют порядок приоритетов, считая более низкие значения более высоким приоритетом, поэтому это может также называться « get_minimum_element его часто называют « get-min ». », а в литературе
- Вместо этого это можно указать как отдельные функции « peek_at_highest_priority_element » и « delete_element », которые можно объединить для создания « pull_highest_priority_element ».
Кроме того, очень часто реализуется функция просмотра (в этом контексте часто называемая find-max или find-min ), которая возвращает элемент с наивысшим приоритетом, но не изменяет очередь, и почти всегда выполняется за O (1) время . Эта операция и ее производительность O (1) имеют решающее значение для многих приложений приоритетных очередей.
Более продвинутые реализации могут поддерживать более сложные операции, такие как pull_lowest_priority_element , проверка первых нескольких элементов с самым высоким или самым низким приоритетом, очистка очереди, очистка подмножеств очереди, выполнение пакетной вставки, объединение двух или более очередей в одну, увеличение приоритета. любого элемента и т. д.
Стеки и очереди могут быть реализованы как особые виды приоритетных очередей, причем приоритет определяется порядком вставки элементов. В стеке приоритет каждого вставленного элемента монотонно увеличивается; таким образом, последний вставленный элемент всегда извлекается первым. В очереди приоритет каждого вставленного элемента монотонно уменьшается; таким образом, первый вставленный элемент всегда извлекается первым.
Выполнение
[ редактировать ]Наивные реализации
[ редактировать ]Существует множество простых, обычно неэффективных способов реализации приоритетной очереди. Они предоставляют аналогию, помогающую понять, что такое приоритетная очередь.
Например, можно хранить все элементы в несортированном списке ( время вставки O (1)). Всякий раз, когда запрашивается элемент с наивысшим приоритетом, выполните поиск среди всех элементов элемента с наивысшим приоритетом. ( O ( n ) время вытягивания),
insert(node) { list.append(node) }
pull() { highest = list.get_first_element() foreach node in list { if highest.priority < node.priority { highest = node } } list.remove(highest) return highest }
В другом случае можно сохранить все элементы в отсортированном по приоритету списке ( время сортировки вставкой O (n)), всякий раз, когда запрашивается элемент с наивысшим приоритетом, может быть возвращен первый элемент в списке. ( O (1) время вытягивания)
insert(node) { foreach (index, element) in list { if node.priority < element.priority { list.insert_at_index(node,index) break } } }
pull() { highest = list.get_at_index(list.length-1) list.remove(highest) return highest }
Обычная реализация
[ редактировать ]Чтобы повысить производительность, очереди с приоритетами обычно основываются на куче , что дает производительность O (log n ) для вставок и удалений и O ( n ) для первоначального построения кучи из набора из n элементов. Варианты базовой структуры данных кучи, такие как парные кучи или кучи Фибоначчи, могут обеспечить лучшие границы для некоторых операций. [ 1 ]
В качестве альтернативы, когда самобалансирующееся двоичное дерево поиска используется , вставка и удаление также занимают время O (log n ), хотя построение деревьев из существующих последовательностей элементов занимает O ( n log n время ); это типично для тех случаев, когда кто-то уже имеет доступ к этим структурам данных, например, с помощью сторонних или стандартных библиотек. С точки зрения пространственной сложности, использование самобалансирующегося двоичного дерева поиска со связанным списком требует больше места для хранения, поскольку требует хранения дополнительных ссылок на другие узлы.
С точки зрения вычислительной сложности очереди с приоритетами соответствуют алгоритмам сортировки. В разделе об эквивалентности приоритетных очередей и алгоритмов сортировки ниже описывается, как эффективные алгоритмы сортировки могут создавать эффективные приоритетные очереди.
Специализированные кучи
[ редактировать ]Существует несколько специализированных кучи структур данных , которые либо предоставляют дополнительные операции, либо превосходят реализации на основе кучи для определенных типов ключей, особенно целочисленных ключей. Предположим, что набор возможных ключей равен {1, 2, ..., C}.
- только команды Insert , find-min и Extract-min Когда необходимы и в случае целочисленных приоритетов, очередь сегментов может быть построена как массив C связанных списков плюс указатель top первоначально C. , Вставка элемента с ключом k добавляет элемент в k -й список и обновляет top ← min(top, k ) , оба за постоянное время. Extract-min удаляет и возвращает один элемент из списка с индексом top , затем при необходимости увеличивает top, пока он снова не укажет на непустой список; это занимает время O ( C ) в худшем случае . Эти очереди полезны для сортировки вершин графа по их степени. [ 2 ] : 374
- Дерево Ван Эмде Боаса поддерживает операции минимума , максимума , вставки , удаления , поиска , извлечения-мин , извлечения-максимума , предшественника и преемника] за время O (log log C ), но для небольших очередей требуется пространство около O. (2 м /2 ), где m — количество битов в значении приоритета. [ 3 ] Пространство можно значительно уменьшить с помощью хеширования.
- Дерево Fusion Фредмана извлечения и Уилларда реализует минимальную операцию за время O (1), а вставки и - за минимальное время . операции время. Однако автор заявляет, что «Наши алгоритмы представляют только теоретический интерес; постоянные факторы, влияющие на время выполнения, исключают практичность». [ 4 ]
Для приложений, которые выполняют множество операций « peek » для каждой операции «extract-min», временная сложность действий просмотра может быть уменьшена до O (1) во всех реализациях дерева и кучи путем кэширования элемента с наивысшим приоритетом после каждой вставки и удаления. При вставке это увеличивает не более чем постоянные затраты, поскольку вновь вставленный элемент сравнивается только с ранее кэшированным минимальным элементом. При удалении это в лучшем случае добавляет дополнительные затраты на просмотр, которые обычно дешевле, чем стоимость удаления, поэтому на общую временную сложность существенно не влияет.
Очереди с монотонными приоритетами — это специализированные очереди, оптимизированные для случая, когда никогда не вставляется элемент с более низким приоритетом (в случае минимальной кучи), чем любой ранее извлеченный элемент. Это ограничение встречается в нескольких практических применениях очередей с приоритетами.
Сводка времени работы
[ редактировать ]Вот временные сложности [ 5 ] различных структур данных кучи. Аббревиатура ам. указывает, что данная сложность амортизируется, в противном случае это сложность наихудшего случая. Значение « O ( f )» и « Θ ( f )» см в обозначении Big O. . Имена операций предполагают минимальную кучу.
Операция | найти-мин | удаление-мин | клавиша уменьшения | вставлять | сливаться | помойка [ а ] |
---|---|---|---|---|---|---|
Двоичный [ 5 ] | я (1) | Θ (логарифм n ) | Θ (логарифм n ) | Θ (логарифм n ) | Θ ( н ) | Θ ( н ) |
Перекос [ 6 ] | я (1) | О (log n ) утра. | О (log n ) утра. | О (log n ) утра. | О (log n ) утра. | Θ ( н ) утра. |
Левый [ 7 ] | я (1) | Θ (логарифм n ) | Θ (логарифм n ) | Θ (логарифм n ) | Θ (логарифм n ) | Θ ( н ) |
Биномиальный [ 5 ] [ 9 ] | я (1) | Θ (логарифм n ) | Θ (логарифм n ) | Θ (1) утра. | Θ (логарифм n ) [ б ] | Θ ( н ) |
Наклонный бином [ 10 ] | я (1) | Θ (логарифм n ) | Θ (логарифм n ) | я (1) | Θ (логарифм n ) [ б ] | Θ ( н ) |
2–3 кучи [ 12 ] | я (1) | О (log n ) утра. | я (1) | Θ (1) утра. | О ( войти ) [ б ] | Θ ( н ) |
Перекос снизу вверх [ 6 ] | я (1) | О (log n ) утра. | О (log n ) утра. | Θ (1) утра. | Θ (1) утра. | Θ ( н ) утра. |
Сопряжение [ 13 ] | я (1) | О (log n ) утра. | о (log n ) утра. [ с ] | я (1) | я (1) | Θ ( н ) |
Сопряжение по рангам [ 16 ] | я (1) | О (log n ) утра. | Θ (1) утра. | я (1) | я (1) | Θ ( н ) |
Фибоначчи [ 5 ] [ 17 ] | я (1) | О (log n ) утра. | Θ (1) утра. | я (1) | я (1) | Θ ( н ) |
Строгий Фибоначчи [ 18 ] [ д ] | я (1) | Θ (логарифм n ) | я (1) | я (1) | я (1) | Θ ( н ) |
Мостовая долина [ 19 ] [ д ] | я (1) | Θ (логарифм n ) | я (1) | я (1) | я (1) | Θ ( н ) [ 20 ] |
- ^ make-heap — это операция построения кучи из последовательности из n неотсортированных элементов. Это можно сделать за время Θ ( n ), когда объединение выполняется за время O (log n ) (при этом обе сложности могут быть амортизированы). [ 6 ] [ 7 ] Другой алгоритм достигает Θ ( n ) для двоичных куч. [ 8 ]
- ^ Перейти обратно: а б с Для постоянных куч (не поддерживающих уменьшение-ключа ) общее преобразование снижает стоимость объединения до стоимости вставки , в то время как новая стоимость удаления-мин представляет собой сумму старых затрат на удаление-мин и объединение . [ 11 ] Здесь он выполняет объединение за время Θ (1) (амортизируется, если стоимость вставки равна), в то время как delete-min все еще выполняется за O (log n ). Применительно к косым биномиальным кучам он дает очереди Бродала-Окасаки, постоянные кучи с оптимальной сложностью для наихудшего случая. [ 10 ]
- ^ Нижняя граница [ 14 ] верхняя граница [ 15 ]
- ^ Перейти обратно: а б Очереди Бродала и строгие кучи Фибоначчи обеспечивают оптимальную сложность кучи в наихудшем случае. Впервые они были описаны как императивные структуры данных. Очередь Бродала-Окасаки представляет собой постоянную структуру данных, обеспечивающую тот же оптимум, за исключением того, что уменьшение ключа не поддерживается.
Эквивалентность приоритетных очередей и алгоритмов сортировки
[ редактировать ]Использование приоритетной очереди для сортировки
[ редактировать ]Семантика ; приоритетных очередей естественным образом предполагает метод сортировки: вставить все элементы, подлежащие сортировке, в приоритетную очередь и последовательно удалить их они выйдут в отсортированном порядке. На самом деле это процедура, используемая несколькими алгоритмами сортировки после удаления уровня абстракции , обеспечиваемого очередью приоритетов. Этот метод сортировки эквивалентен следующим алгоритмам сортировки:
Имя | Реализация приоритетной очереди | Лучший | Средний | Худший |
---|---|---|---|---|
пирамидальная сортировка | Куча | |||
Гладкая сортировка | Леонардо Хип | |||
Сортировка выбором | Неупорядоченный массив | |||
Сортировка вставкой | Упорядоченный массив | |||
Сортировка дерева | Самобалансирующееся двоичное дерево поиска |
Использование алгоритма сортировки для создания приоритетной очереди
[ редактировать ]Алгоритм сортировки также можно использовать для реализации приоритетной очереди. В частности, Торуп говорит: [ 21 ]
Мы представляем общее детерминированное линейное сокращение пространства от приоритетных очередей к сортировке, подразумевающее, что если мы можем сортировать до n ключей за S ( n ) время на каждый ключ, то существует приоритетная очередь, поддерживающая удаление и вставку за O ( S ( n )). время и найти-мин в постоянном времени.
То есть, если существует алгоритм сортировки, который может сортировать за время O ( S ) на ключ, где S — некоторая функция от n и размера слова , [ 22 ] затем можно использовать данную процедуру для создания приоритетной очереди, в которой извлечение элемента с наивысшим приоритетом занимает время O (1), а вставка новых элементов (и удаление элементов) — время O ( S ). Например, если у вас есть алгоритм сортировки O ( n log n ), можно создать очередь с приоритетом с извлечением O (1) и вставкой O (log n ).
Библиотеки
[ редактировать ]Очередь с приоритетами часто рассматривается как « контейнерная структура данных ».
Стандартная библиотека шаблонов (STL) и стандарт C++ 1998 определяют std::priority_queue STL контейнера адаптера как один из шаблонов класса . Однако он не определяет, как должны обслуживаться два элемента с одинаковым приоритетом, и действительно, общие реализации не будут возвращать их в соответствии с их порядком в очереди. Он реализует очередь с максимальным приоритетом и имеет три параметра: объект сравнения для сортировки, такой как объект функции (по умолчанию less<T>, если не указано), базовый контейнер для хранения структур данных (по умолчанию std::vector <T>) и два итератора для начала и конца последовательности. В отличие от реальных контейнеров STL, он не допускает итерации своих элементов (он строго придерживается определения абстрактного типа данных). В STL также есть служебные функции для управления другим контейнером с произвольным доступом в виде двоичной максимальной кучи. Библиотеки Boost также имеют реализацию в куче библиотеки.
Модуль Python heapq реализует двоичную минимальную кучу поверх списка.
Java содержит Библиотека PriorityQueue
класс, который реализует очередь с минимальным приоритетом в виде двоичной кучи.
.NET Библиотека содержит класс PriorityQueue , который реализует четвертичную минимальную кучу на основе массива.
класс Библиотека Scala содержит PriorityQueue , который реализует очередь с максимальным приоритетом.
Go Библиотека содержит модуль контейнера/кучи , который реализует минимальную кучу поверх любой совместимой структуры данных.
Расширение стандартной библиотеки PHP содержит класс SplPriorityQueue .
Платформа Apple Core Foundation содержит структуру CFBinaryHeap , которая реализует минимальную кучу.
Приложения
[ редактировать ]Управление пропускной способностью
[ редактировать ]Очередь с приоритетами можно использовать для управления ограниченными ресурсами, такими как полоса пропускания линии передачи от сетевого маршрутизатора . В случае постановки в очередь исходящего трафика из-за недостаточной пропускной способности все остальные очереди могут быть остановлены, чтобы по прибытии отправлять трафик из очереди с наивысшим приоритетом. Это гарантирует, что приоритетный трафик (например, трафик в реальном времени, например RTP поток соединения VoIP ) пересылается с наименьшей задержкой и наименьшей вероятностью быть отклоненным из-за достижения максимальной емкости очереди. Весь остальной трафик может быть обработан, когда очередь с наивысшим приоритетом пуста. Другой используемый подход заключается в отправке непропорционально большего количества трафика из очередей с более высоким приоритетом.
Многие современные протоколы для локальных сетей также включают концепцию приоритетных очередей на подуровне управления доступом к среде передачи (MAC), чтобы гарантировать, что высокоприоритетные приложения (такие как VoIP или IPTV ) испытывают меньшую задержку, чем другие приложения, которые могут обслуживаться с помощью лучший сервис . Примеры включают IEEE 802.11e (поправка к IEEE 802.11 , которая обеспечивает качество обслуживания ) и ITU-T G.hn (стандарт высокоскоростной локальной сети с использованием существующей домашней проводки ( линии электропередачи , телефонные линии и коаксиальные кабели ).
Обычно ограничение (полисер) устанавливается для ограничения полосы пропускания, которую может занимать трафик из очереди с наивысшим приоритетом, чтобы пакеты с высоким приоритетом не перекрывали весь остальной трафик. Этот предел обычно никогда не достигается из-за экземпляров управления высокого уровня, таких как Cisco Callmanager , который можно запрограммировать на запрет вызовов, которые превышают запрограммированный предел пропускной способности.
Дискретное моделирование событий
[ редактировать ]Другое использование очереди приоритетов — управление событиями при моделировании дискретных событий . События добавляются в очередь, при этом время их моделирования используется в качестве приоритета. Выполнение моделирования продолжается путем многократного извлечения вершины очереди и выполнения на ней события.
См. также : Планирование (вычисления) , теория массового обслуживания.
Алгоритм Дейкстры
[ редактировать ]Когда граф хранится в форме списка или матрицы смежности , очередь приоритетов может использоваться для эффективного извлечения минимума при реализации алгоритма Дейкстры , хотя также необходима возможность эффективно изменять приоритет конкретной вершины в очереди приоритетов.
Если вместо этого граф сохраняется как объекты узла, а пары узлов-приоритетов вставляются в кучу, изменение приоритета конкретной вершины не требуется, если отслеживаются посещенные узлы. Если после посещения узла он снова появляется в куче (ранее с ним был связан более низкий номер приоритета), он извлекается и игнорируется.
Кодирование Хаффмана
[ редактировать ]Кодирование Хаффмана требует многократного получения двух деревьев с самой низкой частотой. Очередь с приоритетами является одним из способов сделать это .
Алгоритмы поиска по принципу «лучший первый»
[ редактировать ]поиска по принципу «сначала лучший» Алгоритмы , такие как алгоритм поиска A* , находят кратчайший путь между двумя вершинами или узлами , взвешенного графа сначала проверяя наиболее перспективные маршруты. Очередь приоритетов (также известная как fringe ) используется для отслеживания неисследованных маршрутов; тот, для которого оценка (нижняя граница в случае A*) общей длины пути наименьшая, получает наивысший приоритет. Если ограничения памяти делают поиск по принципу «сначала лучшее» непрактичным, SMA * вместо него можно использовать такие варианты, как алгоритм , с двусторонней приоритетной очередью , позволяющей удалять элементы с низким приоритетом.
Алгоритм триангуляции ROAM
[ редактировать ]Алгоритм оптимально адаптирующихся сеток в реальном времени ( ROAM ) вычисляет динамически изменяющуюся триангуляцию ландшафта. Он работает путем разделения треугольников там, где требуется больше деталей, и объединения их там, где требуется меньше деталей. Алгоритм назначает каждому треугольнику на местности приоритет, обычно связанный с уменьшением ошибки, если этот треугольник будет разделен. Алгоритм использует две очереди приоритетов: одну для треугольников, которые можно разделить, и другую для треугольников, которые можно объединить. На каждом шаге треугольник из разделенной очереди с наивысшим приоритетом разделяется или треугольник из очереди слияния с наименьшим приоритетом объединяется со своими соседями.
Алгоритм Прима для минимального остовного дерева
[ редактировать ]Используя очередь с минимальным приоритетом кучи в алгоритме Прима для поиска минимального связующего дерева , связного и неориентированного графа можно добиться хорошего времени работы. Эта очередь с приоритетом минимальной кучи использует структуру данных минимальной кучи, которая поддерживает такие операции, как вставка , минимум , извлечение-мин , уменьшение-ключ . [ 23 ] В этой реализации вес ребер используется для определения приоритета вершин . Чем ниже вес, тем выше приоритет, чем выше вес, тем ниже приоритет. [ 24 ]
Параллельная приоритетная очередь
[ редактировать ]Распараллеливание можно использовать для ускорения приоритетных очередей, но требует некоторых изменений в интерфейсе приоритетной очереди. Причина таких изменений в том, что последовательное обновление обычно имеет только или затрат, и распараллеливание такой операции не имеет никакой практической выгоды. Одним из возможных изменений является разрешение одновременного доступа нескольких процессоров к одной и той же приоритетной очереди. Второе возможное изменение — разрешить пакетные операции, которые работают с элементы, а не только один элемент. Например, ExtractMin удалит первый элементы с наивысшим приоритетом.
Параллельный доступ
[ редактировать ]Если приоритетная очередь допускает одновременный доступ, несколько процессов могут одновременно выполнять операции в этой приоритетной очереди. Однако это поднимает две проблемы. Прежде всего, определение семантики отдельных операций уже не является очевидным. Например, если два процесса хотят извлечь элемент с наивысшим приоритетом, должны ли они получить один и тот же элемент или разные? Это ограничивает параллелизм на уровне программы, использующей очередь приоритетов. Кроме того, поскольку к одному и тому же элементу имеют доступ несколько процессов, это приводит к конфликтам.
Параллельный доступ к приоритетной очереди может быть реализован на основе модели PRAM одновременного чтения и одновременной записи (CRCW). Далее приоритетная очередь реализована в виде списка пропуска . [ 25 ] [ 26 ] Кроме того, примитив атомарной синхронизации CAS используется для блокировки блокировки списка пропуска . Узлы списка пропуска состоят из уникального ключа, приоритета, массива указателей для каждого уровня на следующие узлы и метки удаления . Метка удаления отмечает, что узел собирается быть удален процессом. Это гарантирует, что другие процессы смогут соответствующим образом отреагировать на удаление.
- Insert(e) : сначала создается новый узел с ключом и приоритетом. Кроме того, узлу назначается несколько уровней, определяющих размер массива указателей. Затем выполняется поиск, чтобы найти правильную позицию, куда вставить новый узел. Поиск начинается с первого узла и с самого высокого уровня. Затем список пропуска просматривается до самого нижнего уровня, пока не будет найдена правильная позиция. Во время поиска для каждого уровня последний пройденный узел будет сохранен как родительский узел для нового узла на этом уровне. Кроме того, узел, на который указывает указатель родительского узла на этом уровне, будет сохранен как узел-преемник нового узла на этом уровне. После этого для каждого уровня нового узла указатели родительского узла будут установлены на новый узел. Наконец, указатели для каждого уровня нового узла будут установлены на соответствующие узлы-преемники.
- extract-min : сначала список пропуска просматривается до тех пор, пока не будет достигнут узел, метка удаления которого не установлена. Для этой метки удаления устанавливается значение true для этого узла. Наконец, указатели родительских узлов удаленного узла обновляются.
Если разрешен одновременный доступ к приоритетной очереди, между двумя процессами могут возникнуть конфликты. Например, конфликт возникает, если один процесс пытается вставить новый узел, но в то же время другой процесс собирается удалить предшественника этого узла. [ 25 ] Существует риск того, что новый узел будет добавлен в список пропуска, но станет недоступен. ( См. изображение )
K -элементные операции
[ редактировать ]В этом случае операции в приоритетной очереди обобщаются до пакета элементы. Например, k_extract-min удаляет наименьшие элементы приоритетной очереди и возвращает их.
В условиях общей памяти параллельная очередь приоритетов может быть легко реализована с использованием параллельных деревьев двоичного поиска и алгоритмов деревьев на основе соединений . В частности, k_extract-min соответствует разбиению двоичного дерева поиска, которое имеет стоимость и дает дерево, содержащее мельчайшие элементы. k_insert может применяться путем объединения исходной приоритетной очереди и пакета вставок. Если пакет уже отсортирован по ключу, k_insert имеет расходы. В противном случае нам нужно сначала отсортировать партию, поэтому стоимость будет равна . Другие операции для приоритетной очереди могут применяться аналогичным образом. Например, k_decrease-key можно выполнить, сначала применив разницу , а затем объединение , которое сначала удаляет элементы, а затем вставляет их обратно с обновленными ключами. Все эти операции в высокой степени параллельны, а теоретическую и практическую эффективность можно найти в соответствующих исследовательских работах. [ 27 ] [ 28 ]
В оставшейся части этого раздела обсуждается алгоритм на основе очередей в распределенной памяти. Мы предполагаем, что каждый процессор имеет собственную локальную память и локальную (последовательную) очередь с приоритетами. Элементы глобальной (параллельной) очереди приоритетов распределяются по всем процессорам.
Операция k_insert равномерно случайным образом назначает элементы процессорам, которые вставляют элементы в свои локальные очереди. Обратите внимание, что отдельные элементы по-прежнему можно вставлять в очередь. Используя эту стратегию, глобальные наименьшие элементы с высокой вероятностью объединяются с локальными наименьшими элементами каждого процессора. Таким образом, каждый процессор содержит репрезентативную часть очереди глобальных приоритетов.
Это свойство используется при выполнении k_extract-min как наименьшее элементы каждой локальной очереди удаляются и собираются в набор результатов. Элементы результирующего набора по-прежнему связаны со своим исходным процессором. Количество элементов который удаляется из каждой локальной очереди, зависит от и количество процессоров . [ 29 ] Путем параллельного выбора определяются наименьшие элементы результирующего набора. С высокой вероятностью это глобальные мельчайшие элементы. Если не, элементы снова удаляются из каждой локальной очереди и помещаются в набор результатов. Это делается до тех пор, пока глобальный наименьшие элементы находятся в наборе результатов. Теперь эти элементы можно вернуть. Все остальные элементы набора результатов вставляются обратно в свои локальные очереди. время работы k_extract-min. Ожидается , где и — размер приоритетной очереди. [ 29 ]
Очередь с приоритетами можно дополнительно улучшить, не перемещая оставшиеся элементы результирующего набора непосредственно обратно в локальные очереди после операции k_extract-min . Это позволяет избежать постоянного перемещения элементов вперед и назад между набором результатов и локальными очередями.
Удалив сразу несколько элементов, можно добиться значительного ускорения. Но не все алгоритмы могут использовать такую очередь с приоритетами. Например, алгоритм Дейкстры не может работать на нескольких узлах одновременно. Алгоритм берет узел с наименьшим расстоянием из приоритетной очереди и вычисляет новые расстояния для всех соседних узлов. Если бы ты вынул узлов, работая на одном узле, можно изменить расстояние до другого узлы. Таким образом, использование операций с k-элементами разрушает свойство установки меток алгоритма Дейкстры.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Штейн, Клиффорд (2001) [1990]. «Глава 20: Кучи Фибоначчи». Введение в алгоритмы (2-е изд.). MIT Press и McGraw-Hill. стр. 476–497. ISBN 0-262-03293-7 . Третье издание, с. 518.
- ^ Скиена, Стивен (2010). Руководство по разработке алгоритмов (2-е изд.). Springer Science+Business Media . ISBN 978-1-849-96720-4 .
- ^ П. ван Эмде Боас. Поддержание порядка в лесу менее чем за логарифмическое время. В материалах 16-го ежегодного симпозиума по основам информатики , страницы 75-84. Компьютерное общество IEEE, 1975.
- ^ Майкл Л. Фредман и Дэн Э. Уиллард. Преодоление теории информации, связанной с деревьями слияния. Журнал компьютерных и системных наук , 48(3):533-551, 1994 г.
- ^ Перейти обратно: а б с д Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л. (1990). Введение в алгоритмы (1-е изд.). MIT Press и McGraw-Hill. ISBN 0-262-03141-8 .
- ^ Перейти обратно: а б с Слитор, Дэниел Доминик ; Тарьян, Роберт Эндре (февраль 1986 г.). «Саморегулирующиеся кучи» . SIAM Journal по вычислительной технике . 15 (1): 52–69. CiteSeerX 10.1.1.93.6678 . дои : 10.1137/0215004 . ISSN 0097-5397 .
- ^ Перейти обратно: а б Тарьян, Роберт (1983). «3.3. Левые кучи». Структуры данных и сетевые алгоритмы . стр. 38–42. дои : 10.1137/1.9781611970265 . ISBN 978-0-89871-187-5 .
- ^ Хейворд, Райан; МакДиармид, Колин (1991). «Анализ среднего случая построения кучи путем повторной вставки» (PDF) . Дж. Алгоритмы . 12 : 126–153. CiteSeerX 10.1.1.353.7888 . дои : 10.1016/0196-6774(91)90027-в . Архивировано из оригинала (PDF) 5 февраля 2016 г. Проверено 28 января 2016 г.
- ^ «Биномиальная куча | Блестящая вики по математике и естественным наукам» . блестящий.орг . Проверено 30 сентября 2019 г.
- ^ Перейти обратно: а б Бродал, Герт Столтинг; Окасаки, Крис (ноябрь 1996 г.), «Оптимальные чисто функциональные очереди приоритетов», Journal of Functional Programming , 6 (6): 839–857, doi : 10.1017/s095679680000201x
- ^ Окасаки, Крис (1998). «10.2. Структурная абстракция». Чисто функциональные структуры данных (1-е изд.). стр. 158–162. ISBN 9780521631242 .
- ^ Такаока, Тадао (1999), Теория 2–3 куч (PDF) , стр. 12
- ^ Яконо, Джон (2000), «Улучшенные верхние границы для спаривания куч», Proc. 7-й скандинавский семинар по теории алгоритмов (PDF) , Конспекты лекций по информатике, том. 1851, Springer-Verlag, стр. 63–77, arXiv : 1110.4428 , CiteSeerX 10.1.1.748.7812 , doi : 10.1007/3-540-44985-X_5 , ISBN 3-540-67690-2
- ^ Фредман, Майкл Лоуренс (июль 1999 г.). «Об эффективности объединения куч и связанных структур данных» (PDF) . Журнал Ассоциации вычислительной техники . 46 (4): 473–501. дои : 10.1145/320211.320214 .
- ^ Петти, Сет (2005). К окончательному анализу парных куч (PDF) . FOCS '05 Материалы 46-го ежегодного симпозиума IEEE по основам информатики. стр. 174–183. CiteSeerX 10.1.1.549.471 . дои : 10.1109/SFCS.2005.75 . ISBN 0-7695-2468-0 .
- ^ Хёплер, Бернхард; Сен, Сиддхартха; Тарьян, Роберт Э. (ноябрь 2011 г.). «Кучи ранговых пар» (PDF) . СИАМ Дж. Компьютерные технологии . 40 (6): 1463–1485. дои : 10.1137/100785351 .
- ^ Фредман, Майкл Лоуренс ; Тарьян, Роберт Э. (июль 1987 г.). «Кучи Фибоначчи и их использование в улучшенных алгоритмах оптимизации сети» (PDF) . Журнал Ассоциации вычислительной техники . 34 (3): 596–615. CiteSeerX 10.1.1.309.8927 . дои : 10.1145/28869.28874 .
- ^ Бродал, Герт Столтинг ; Лагояннис, Джордж; Тарьян, Роберт Э. (2012). Строгие кучи Фибоначчи (PDF) . Материалы 44-го симпозиума по теории вычислений - STOC '12. стр. 1177–1184. CiteSeerX 10.1.1.233.1740 . дои : 10.1145/2213977.2214082 . ISBN 978-1-4503-1245-5 .
- ^ Бродал, Герт С. (1996), «Эффективные приоритетные очереди для наихудшего случая» (PDF) , Proc. 7-й ежегодный симпозиум ACM-SIAM по дискретным алгоритмам , стр. 52–58.
- ^ Гудрич, Майкл Т .; Тамассия, Роберто (2004). «7.3.6. Построение кучи снизу вверх». Структуры данных и алгоритмы в Java (3-е изд.). стр. 338–341. ISBN 0-471-46983-1 .
- ^ Торуп, Миккель (2007). «Эквивалентность приоритетных очередей и сортировки». Журнал АКМ . 54 (6): 28. дои : 10.1145/1314690.1314692 . S2CID 11494634 .
- ^ «Архивная копия» (PDF) . Архивировано (PDF) из оригинала 20 июля 2011 г. Проверено 10 февраля 2011 г.
{{cite web}}
: CS1 maint: архивная копия в заголовке ( ссылка ) - ^ Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Стоун, Клиффорд (2009) [1990]. Введение в алгоритмы (3-е изд.). MIT Press и McGraw-Hill. п. 634. ИСБН 0-262-03384-4 . «Чтобы эффективно реализовать алгоритм Прима, нам нужен быстрый способ выбора нового ребра для добавления в дерево, образованное ребрами в A».
- ^ «Алгоритм Прима» . Выродок для гиков. 18 ноября 2012 года. Архивировано из оригинала 9 сентября 2014 года . Проверено 12 сентября 2014 г.
- ^ Перейти обратно: а б Санделл, Хокан; Цигас, Филиппас (2005). «Быстрые и параллельные очереди приоритетов без блокировок для многопоточных систем» . Журнал параллельных и распределенных вычислений . 65 (5): 609–627. CiteSeerX 10.1.1.67.1310 . дои : 10.1109/IPDPS.2003.1213189 . S2CID 20995116 .
- ^ Линден, Йонссон (2013), «Очередь с параллельным приоритетом на основе скиплистов с минимальным конфликтом памяти» , Технический отчет 2018-003 (на немецком языке)
- ^ Блеллок, Гай Э.; Феризович, Дэниел; Сунь, Ихан (2016), «Просто присоединяйтесь к параллельным упорядоченным наборам», Симпозиум по параллельным алгоритмам и архитектурам, Proc. 28-го симпозиума ACM. Параллельные алгоритмы и архитектуры (SPAA 2016) , ACM, стр. 253–264, arXiv : 1602.02120 , doi : 10.1145/2935764.2935768 , ISBN 978-1-4503-4210-0 , S2CID 2897793
- ^ Блеллок, Гай Э.; Феризович, Дэниел; Сунь, Ихан (2018), «PAM: параллельные дополненные карты», Материалы 23-го симпозиума ACM SIGPLAN по принципам и практике параллельного программирования , ACM, стр. 290–304
- ^ Перейти обратно: а б Сандерс, Питер; Мельхорн, Курт; Дитцфельбингер, Мартин; Дементьев, Роман (2019). Последовательные и параллельные алгоритмы и структуры данных — базовый набор инструментов . Международное издательство Спрингер. стр. 226–229. дои : 10.1007/978-3-030-25209-0 . ISBN 978-3-030-25208-3 . S2CID 201692657 .
Дальнейшее чтение
[ редактировать ]- Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Штейн, Клиффорд (2001) [1990]. «Раздел 6.5: Приоритетные очереди». Введение в алгоритмы (2-е изд.). MIT Press и McGraw-Hill. стр. 138–142. ISBN 0-262-03293-7 .
Внешние ссылки
[ редактировать ]- Справочник по C++ для
std::priority_queue
- Описания Ли Киллоу
- libpqueue — это общая реализация очереди приоритетов (кучи) (на C), используемая проектом HTTP-сервера Apache.
- Обзор известных структур очередей с приоритетами, проведенный Стефаном Ксеносом.
- Калифорнийский университет в Беркли - Информатика 61B - Лекция 24: Очереди приоритетов (видео) - введение в очереди приоритетов с использованием двоичной кучи