CHDataStructures: приоритетная очередь? - PullRequest
1 голос
/ 09 мая 2011

Мне нужна очередь с приоритетами, я думаю, что в рамках CHMutableArrayHeap и CHBinaryHeap могут сделать эту работу, верно?

Однако, если я отправляю объекты с одинаковым приоритетом в очередь, и CHMutableArrayHeap, и CHBinaryHeap не могут поддерживать свои порядки добавления.

например, у меня есть объекты от obj1 до obj10, их приоритеты идентичны. После того, как я добавлю эти 10 объектов в очередь по очереди от 1 до 10, их позиции не совпадают с порядком добавления, obj4 может стоять перед obj1.

Итак, Куинн, что вы предлагаете, если я хочу, чтобы очередь приоритетов сохраняла порядок добавления, если приоритет такой же?

Спасибо

1 Ответ

3 голосов
/ 07 сентября 2011

(Извините, я только видел этот вопрос.)

Природа кучи заключается в том, что она вообще не сохраняет порядок вставки, поэтому вам придется (1) построить очередь с приоритетамиповерх другой структуры данных или (2) дополнить кучу другой структурой данных, которая отслеживает порядок вставки.Однако куча, как правило, является наиболее эффективным (и предпочтительным) способом реализации очереди с приоритетами, поэтому я не знаю, стоит ли использовать что-то еще.Основная причина, по которой я говорю, заключается в том, что вы хотите, чтобы вставка была очень быстрой, что обеспечивает куча;добавление в отсортированный массив - нет.

Одна из возможностей - поддерживать очередь (например, CHCircularBufferQueue) для каждого уровня приоритета.(Я бы подумал, что вы захотите создать структуру-обертку, которая управляла бы очередями, чтобы вызывающим не приходилось иметь с ними дело напрямую.) Вы могли бы потенциально хранить очереди в словаре с ключом NSNumber, содержащим приоритет, но японятия не имею, как будет выглядеть представление.Это, очевидно, не очень эффективно масштабируется до чрезвычайно широкого диапазона приоритетов, и может быть не для большого количества вставок и удалений, но это может быть работоспособным в небольших случаях.Просто идея.

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

Обновление: Я нашел следующие связанные вопросы:

https://stackoverflow.com/questions/tagged/priority-queue

...