Я ищу память и эффективное по времени решение указанной ниже проблемы. Легко думать о базовом c алгоритме, который использует O (n 2 ) памяти и O (n 2 log n) времени (?), И я хотел бы знать, если существует алгоритм, который значительно более эффективен в отношении памяти и времени (для определенных структур ввода).
Input : Массив a длины n, заполненный неотрицательными целыми числами. Каждое целое число в массиве имеет величину, меньшую или равную b. Меня интересуют настройки, где n велико (десятки миллионов), а b относительно мало по сравнению с n (сотнями). Можно предположить, что число вхождений любого конкретного целого числа в a ограничено сверху m, где m порядка n / b.
Рассмотрим множество всех вращений массива a, т. Е. если a = (a 1 , a 2 , ..., a n ), то его повороты составляют (a 1 , a 2 , ..., a n ), (a 2 , a 3 , ..., a n , a 1 ), (a 3 , a 4 , ..., a n , a 1 , a 2 ), ..., (a n , a 1 , a 2 , .. ., n-1 ). Пусть r 1 , r 2 , ..., r n обозначают лексикографически отсортированный (увеличивающийся) порядок вращения массива a (используя 0 <1 <2 <... <b). </p>
Выход : Два массива первый и последний , в которых хранятся первый и последний элементы r 1 , r 2 , ..., r n в соответствии с отсортированным порядком.
Базовый c алгоритм (без использования памяти или времени): составьте все повороты a и сохраните их в матрице A (в которой используется память O (n 2 )). Определите процедуру сортировки (которая использует стандартную технику сортировки) для сортировки А. Извлеките первый и последний столбцы отсортированной матрицы. Предположительно, лучшая временная сложность этапа сортировки составляет O (n 2 log n), т. Е. O (n log n) для алгоритма сортировки, умноженного на O (n) для каждого парного сравнения.
Второй алгоритм : мы можем пройти по массиву и сохранить в нем позиции, которые начинаются с любого целого числа i, меньшего или равного b (это время O (n) и O (нм) операция памяти). Затем мы можем сгенерировать все вращения, начиная с определенного целого числа i, и отсортировать эту матрицу вращений в соответствии с алгоритмом basi c (хранение этой матрицы использует память O (nm), а сортировка предположительно занимает время O (mn log m)). Выходные данные легко сконструировать, повторяя процесс для каждого целого числа i от 0 до b.
Существует ли подход, более эффективный для памяти, в котором используется специализированная стратегия сортировки? Я надеюсь, что для хранения выходных данных требуется только O (n) памяти.