Подтвердить что ты не робот

Быстрая очередь приоритетов с инкрементными обновлениями

Я пытаюсь написать load-balancer в Haskell с минимальной стратегией (частично для удовольствия..). Мне нужна очередь приоритетов, где требуется только "следующие операции":

  • прочитать минимальный ключ
  • +1 на минимальном ключе
  • -1 на любой клавише

Если бы у меня был императивный язык с указателями, я бы, вероятно, пришел с:

Head
  |
Priority 0 -> Item <-> Item <-> Item <-> Item
  |
Priority 1 -> Item <-> Item
  |
Priority 4 -> Item <-> Item <-> Item

Приоритеты подключаются с использованием двусвязного списка, элементов для каждого приоритета. Каждый Item содержит ссылку на главный приоритет. Эта структура будет сложной:

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

Есть ли какая-то (функциональная?) структура данных, которая будет вести себя примерно одинаково? Количество элементов будет составлять не более пары сотен.

4b9b3361

Ответ 1

Мне кажется, что общая структура, которая подходит вашим потребностям, - это очередь приоритетного поиска, как описано в Hinze (2001). Один из лучших пакетов хакеров, обеспечивающих такую ​​структуру, находится здесь: http://hackage.haskell.org/package/psqueues

Возможно, это не настроено точно для вашего рабочего процесса, но это, конечно, не потерто!