Я столкнулся с проблемой, которая требует структуры данных Queue, поддерживающей быстрый поиск k-го максимального элемента.
Требования этой структуры данных следующие:
-
Элементы в очереди не обязательно являются целыми числами, но они должны быть сопоставимы друг с другом, т.е. мы можем сказать, какой из них больше, когда мы сравниваем два элемента (они также могут быть равны).
-
Структура данных должна поддерживать enqueue (добавляет элемент в хвост) и dequeue (удаляет элемент в голове).
-
Он может быстро найти k-й самый большой элемент в очереди, примечание pls k не является константой.
-
Вы можете предположить, что операции enqueue, dequeue и k-й самый большой элемент, находящий все, происходят с одинаковой частотой.
Моя идея - использовать модифицированное сбалансированное двоичное дерево поиска. Дерево такое же, как обычное сбалансированное двоичное дерево поиска, за исключением того, что каждый node i дополняется другим полем n i, n i обозначает количество узлов, содержащихся в поддереве с корнем node i. Вышеупомянутые операции поддерживаются следующим образом:
Для простоты предположим, что все элементы различны.
Enqueue (x): x сначала вставляется в дерево, предположим, что соответствующий node - node t, мы добавляем пару (x, указатель на node t) в очередь.
Dequeue: предположим (e1, node 1) - это элемент в голове, node 1 - это указатель на дерево, соответствующее e1. Мы удаляем node 1 из дерева и удаляем (e1, node 1) из очереди.
Найденный K-й самый большой элемент: предположим, что root node node root, его два дочерних элемента node left и node right (предположим, что все они существуют), мы сравниваем K с n root, возможны три случая:
-
если K < n left, мы находим K-й наибольший элемент в левом поддереве n root;
-
если K > n root -n right, мы находим (Kn root + n right) - самый большой элемент в правом поддереве n root;
-
иначе n root - это node, который мы хотим.
Временная сложность всех трех операций: O (log N), где N - количество элементов, находящихся в очереди.
Как ускорить описанные выше операции? С какими структурами данных и как?