Обратите внимание, пожалуйста, прочитайте нижнюю часть этого ответа, чтобы увидеть, почему на самом деле можно решить эту проблему.Я неправильно прочитал вопрос.
В общем случае это невозможно .Рассмотрим список:
n, n-1, n-2 ... 4, 3, 2, 1
Пары будут:
(n, n-1), (n, n-2) ... (n, 2), (n, 1), (n-1, n-2), (n-1, n-3) ... ... (3, 2), (3, 1), (2, 1)
Следовательно, существует O (n ^ 2) пар и, следовательно, список не может быть построен в O (n log n)
Однако вы можете сделать это с помощью одного прохода списка :
- начинаться с конца списка и работать с обратными словами.
- в то время какперемещение по списку поддерживает кучу чисел, которые вы видели (это приведет к тому, что цикл будет равен O (n log n))
- для любого числа, с которым вы столкнетесь, выполните поиск в куче, чтобы найти все числа, которыеменьше номера, на котором вы сейчас находитесь.Выведите текущее число и число в куче в виде пары.(это O (n log n), чтобы найти первое совпадение в куче, но будет O (n), чтобы найти все меньшие числа)
Для вашего примера :
Список: 3 4 1 6 7 3
начиная со второго элемента
куча (3) элемент (7)
Выход (7,3)
куча (3, 7) предмета (6)
поиск и поиск 7, вывод (6, 3)
куча (3, 6, 7) предмета(1)
искать и ничего не находить
куча (1, 3, 6, 7) item (4)
искать и находить 3 и 1. выходные данные (4,3) (4, 1)
и т. Д. *
Редактировать, это возможно на самом деле
Поскольку JoshD правильно заметил, что мы ищемдля количества элементов вы можете использовать B-дерево вместо кучи, а затем вы можете получить только количество элементов меньше текущего элемента и добавить его в счетчик.