Сортировка как можно больше: значения могут перемещаться не более, чем на k позиций слева
Учитывая массив длины N и целое число K, сортируйте массив как можно больше, чтобы ни один элемент не перемещался больше, чем K позиций слева от него. Однако элемент может путешествовать так же, как ему нравится.
Пусть определим сортировку как число неупорядоченных пар, т.е. сортировка (1,2,3) = 0 и сортировка (3,1,2) = 2.
Уточнение: если первые элементы k+1
массива перемещаются в конец массива, другие должны считаться перемещенными k + 1 позициями влево.
Это вопрос интервью. Я думал о том, чтобы использовать пузырь. Внешний цикл будет запускать K раз с временем выполнения O (nk). Наименьшее целое число будет единственным целым числом, сдвинутым влево K раз. Другие целые числа будут сдвинуты влево меньше, чем K.
Есть ли более эффективный способ решения этой проблемы?
Ответы
Ответ 1
Используйте кучу минут для сортировки списка n элементов в O (n log k).
- Добавьте в кучу первые k + 1 несортированные элементы.
- Повторите этот шаг: вытащите элемент min из кучи. Добавьте его в конец отсортированного списка. добавьте следующий несортированный элемент в кучу.
Поскольку куча всегда имеет не более k + 1 элементов независимо от n, все операции кучи - O (log k), а общее время работы - O (n log k)
Почему это правильно?
Предположим, что это не так. Тогда для некоторых входов мой алгоритм дает неоптимальные сортировки. Пусть я - такой вход, пусть A - выход моего алгоритма на I, и пусть B - оптимальный вид.
Пусть я - первый индекс, где A и B не совпадают. Пусть x = A [i], y = B [i], j - индекс x в B.
Я утверждаю, что замена x и y в B улучшает сортировку B, что является противоречием.
Поскольку A и B идентичны для позиций до i, тот же набор k + 1 элементов имеет право перейти в положение я для обоих. Поскольку мой алгоритм выбрал x как min этих элементов, мы знаем, что x меньше y. Мы также знаем, что j больше i.
Что происходит, когда мы заменяем x и y в B?
Во-первых, обратите внимание, что изменение сортировки не зависит от чего-либо слева от я или справа от j, потому что их позиции относительно как x, так и y не изменяются по свопу.
Мы знаем, что между я и j нет элементов, которые меньше x, потому что мой сорт выбрал наименьший доступный элемент. Поэтому все элементы между я и j не меньше, чем x.
Для каждого элемента между я и j, равным x, замена x и y улучшает сортировку на 1, потому что мы улучшаем y относительно этих элементов, а x не затрагивается.
Для каждого элемента между я и j, большего чем x, сортировка x относительно них улучшается на 1, а в худшем случае сортировка y относительно них деградирует на 1, поэтому чистый эффект в худшем случае 0.
Кроме того, замена x и y улучшает сортировку x относительно y на 1, поэтому этот своп строго улучшает общую сортировку.
Противоречие.
Ответ 2
Наивный подход:
итерация массива слева направо.
Для каждой позиции i
мы рассмотрим подмассив из i to i+k
. Затем мы должны получить минимальнозначный элемент в этом подмассиве и поменять первый элемент этого подмассива с этим элементом.
Теперь перейдите в позицию i+1
и сделайте то же самое.
Оптимизированный подход:
Мы можем использовать дерево сегментов, чтобы решить эту проблему. Используя эту структуру данных, вы можете найти минимальное значение между любым диапазоном массива, а также отредактировать любые данные онлайн в O(logn)
. В вашей проблеме мы можем получить массив решений, используя следующие шаги:
arr[1]
= минимальное значение между позицией 1 до мин (k, n), затем отредактируйте эту позицию с бесконечностью
arr[2]
= минимальное значение между позицией 1 до мин (k + 1, n), затем отредактируйте эту позицию с бесконечностью
arr[3]
= минимальное значение между позицией 1 до мин (k + 2, n), затем отредактируйте эту позицию с бесконечностью
arr[4]
= минимальное значение между позицией 1 до мин (k + 3, n), затем отредактируйте эту позицию с бесконечностью
...
...
arr[n]
= минимальное значение между позицией 1 до мин (k + n, n), затем отредактируйте эту позицию с бесконечностью
Общая сложность O(nlogn)
например:
given array = 5 3 4 7 8 2 1 0 and K = 2
используя этот алгоритм, вы получите массив решений следующим образом:
3 4 5 2 1 0 7 8
sortedness value = 12
Надеюсь, что это поможет!
С уважением,
Agassaa