Для достижения этой границы мы должны думать о деревьях, в частности, о бинарных деревьях поиска. Существует класс двоичных деревьев поиска, у которых есть дополнительная информация в узле, как родитель, левый ребенок, правый ребенок и цвет ... да, я говорю о красных черных деревьях. Сложность времени для вставки одного узла в дерево RB - это O (log n), n - количество узлов дерева. Основная идея - пересечь массив и вставить каждый элемент в дерево RB, но с одним ограничением, если мы обнаружим дублированный элемент, не вставляйте !!!, просто считайте !. Как это сделать? просто добавьте поле «счет» в узел, и каждый раз, когда вы обнаружите дублированный элемент, просто увеличивайте счетчик, но не вставляйте его в качестве нового узла. Для этого в дереве RB будут только элементы O (k), т. Е. O (log n) для нашего примера. Таким образом, сложность вставки одного узла в дерево RB - O (log (log n)). Как только мы вставим все элементы в дерево RB, временной сложностью будет O (n log (log n)). Следующий шаг - пересечь дерево в порядке !! и дублировать каждый элемент таким образом, чтобы счетчик был. Для этого мы имеем отсортированный массив (деревья RB - двоичные деревья поиска), и поскольку сложность времени для перемещения в порядке O (n), общая временная сложность будет равна O (n log (log n)).
Все, что вы пробовали, можете ли вы обновить свой вопрос с помощью одной из этих попыток? –
Неужели неудобно сначала определить сложность и найти алгоритм позже? Это больше похоже на вопрос экзамена: «Какой стабильный алгоритм сортировки предлагает сложность O (n log (log n))?» Вот список общих алгоритмов сортировки с их сложностью: http://en.wikipedia.org/wiki/Sorting_algorithm –