Это не домашнее задание.
Я использую небольшую "очередь приоритетов" (реализованную как массив в данный момент) для хранения последних N элементов с наименьшим значением. Это немного медленнее - время вставки элемента O (N). Текущая реализация отслеживает наибольший элемент в массиве и отбрасывает любые элементы, которые не вписываются в массив, но я все же хотел бы уменьшить количество операций.
ищет алгоритм очереди приоритетов, который соответствует следующим требованиям:
- очередь может быть реализована как массив, который имеет фиксированный размер и _cannot_ растет. Динамическое распределение памяти во время любой операции в очереди строго запрещено.
- Все, что не вписывается в массив, отбрасывается, но очередь сохраняет все мельчайшие элементы, которые когда-либо встречались.
- O (log (N)) время ввода (т.е. добавление элемента в очередь должно занимать до O (log (N))).
- (необязательно) O (1) доступ к * наибольшему * элементу в очереди (в очереди хранятся * наименьшие * элементы, поэтому самый большой элемент будет отброшен первым, и мне понадобятся они, чтобы уменьшить количество операций)
- Легко реализовать/понять. В идеале - нечто похожее на двоичный поиск - как только вы это понимаете, вы помните его навсегда.
- Элементы не нужно сортировать. Мне просто нужно сохранить N наименьшее значение, которое когда-либо встречалось. Когда они мне понадобятся, я сразу же получу доступ ко всем. Так что технически это не обязательно должна быть очередь, мне просто нужно N последних наименьших значений, которые нужно сохранить.
Вначале я думал об использовании двоичных кучек (их можно легко реализовать с помощью массивов), но, по-видимому, они плохо себя ведут, когда массив больше не может расти. Связанные списки и массивы потребуют дополнительного времени для перемещения вещей. stl priority queue растет и использует динамическое распределение (я могу ошибаться, хотя).
Итак, любые другие идеи?
- EDIT--
Меня не интересует реализация STL. Реализация STL (предлагаемая несколькими людьми) работает немного медленнее, чем в настоящее время используемая линейная матрица из-за большого количества вызовов функций.
Мне интересны алгоритмы очереди приоритетов, а не реализации.