Я думаю, что следующее решение будет приемлемым.Он основан на двух структурах данных:
- Красно-черное дерево
- Двоичная куча
Двоичная куча содержит кортеж, который содержит (значение элемента, частотуэлемент), куча построена на частотах, так что это дает нам возможность найти режим в O (1).
Красно-черное дерево содержит кортеж, который содержит (значение элемента, указатель на то же значение элемента в куче)
Когда вам нужно вставить новый элемент, вы попытаетесь найти элемент (он занимает O(log n)), если поиск был успешным, перейдите к указателю из элемента, найденного в RB-дереве, увеличьте частоту и восстановите кучу (также O (log n)).Если поиск не нашел такого элемента, чем вставить его в RB-дерево (O (log n)) и сложить со значением = (element, 1) (также O (1)), установите указатель в RB-дереве на новыйэлемент в куче.
Первоначальное построение займет O (n), потому что построение обеих структур из набора элементов n требует O (n).
Извините, если я что-то пропустил.