2015-07-24 3 views
0

Мне нужно сохранить объекты действия, которые имеют свойство времени выполнения и ссылку на самого исполнителя (единицы). Когда блок выполняет действие, он получает добавление в PriorityQueue со временем, которое требуется для выполнения этого действия. Этому исполнителю не разрешается выполнять повтор, пока он не будет первым в списке. Я никогда раньше не работал с приоритетом, поэтому я не знаю о его возможностях.PriorityQueue правильная структура данных?

Итак, как это сделать? Давайте посмотрим на следующее отсортированное действии:

time:1600 -> unit:1 
time:3700 -> unit:2 
time:12000 -> unit:3 

Теперь я хочу, чтобы получить доступ к этим структурам данных и снизить все эти time свойства на 1600 и включите один блок выполнить снова. Если я продолжу добавлять вовремя, я скоро вступлю в максимум. Я мог бы использовать длинный, но в конечном итоге я столкнусь с той же проблемой. Во всяком случае, я думаю, для каждого типа я должен перебирать полный список или устанавливать для изменения свойств объекта в нем. При вставке я просто сравниваю время для быстрой вставки в структуру, такую ​​как PriorityQueue.

Какую структуру данных я должен использовать для этого?

ответ

1

Вы можете легко удалить первый элемент из очереди приоритетов.

Предлагаю вам использовать дополнительное целочисленное значение delta, в котором вы найдете . С этим утверждением вам нужно только вычислить 3700-дельту, если вы удалите узел 3700/блок 2 из очереди приоритетов. После удаления элемента вам необходимо снова изменить эту дельта.

Фактически, вы не изменяете порядок в очереди приоритетов, добавляя определенное значение ко всем записям, чтобы вам не пришлось изменять структуру данных.

Чтобы предотвратить увеличение дельты до бесконечности, вам необходимо обновить все записи после того, как дельта достигнет порога. Преимущество такого подхода заключается в том, что вам нужно обновлять данные только элементов очень редко.

Очередь приоритетов - один из лучших подходов к решению этой проблемы. Главное преимущество заключается в том, что элемент с наименьшим приоритетом всегда наверху.

+0

Но эта дельта или время растет бесконечно? Поскольку, когда я удаляю запись, эта единица должна вставить запись снова. Действия имеют фиксированное время. Итак, допустим, я удаляю первый 'delta = 1600', а затем создаю для него действие' time + delta'. Дельта будет расти бесконечно. – Madmenyo

+0

Спасибо за редактирование, я думал об этом, но было непонятно, как фактически использовалась дельта. И PriorityQue - отличный выбор для этого права? – Madmenyo

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