Сортировка как можно больше: значения могут перемещаться не более, чем на 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