def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
Попробуйте онлайн!
Использует нулевую индексацию.
Быстрый алгоритм с простой идеей. Если вместо этого мы должны переставить список ввода , чтобы сделать его как можно ближе к ( 1 , 2 , . . . , П ) , насколько это возможно, мы должны просто разбирайтесь, как доказано ниже. Поскольку мы вместо перестановки ( 1 , 2 , . . . , П ) , мы выбираем перестановку , что заказали точно так же , как список ввода, как в моем вызове Подражать упорядоченность ( за исключением ввода может быть повторы). (Изменить: мили указали на этот более идентичный вызов , где Деннис имеет тот же ответ .)
Утверждение: Перестановка из списка L , что сводит к минимуму ее расстояние до (1,2,...,n) является l отсортирован.
Доказательство: рассмотрим некоторую другую перестановку l′ из l . Мы докажем , что не может быть лучше , чем l отсортирован.
Выберите два индекса i,j , у которых l′ не в порядке, то есть где i<j но l′i>l′J . Показано , что замена их не может увеличить расстояние до ( 1 , 2 , . . ., П ) . Отметим, что своп изменяет вклад этих двух элементов следующим образом:
| L'я- я | + | L'J- J | → | L'я- J | + | L'J- я | ,
Вот отличный способ показать, что это не может быть увеличение. Рассмотрим двух людей, идущих по числовой линии: один идет от L'я до я а другой от L'J до J . Общее расстояние, которое они проходят, - это выражение слева. Поскольку я < j но L'я> л'J , они переключают, кто выше на числовой линии, что означает, что они должны пересекаться в какой-то момент во время своих прогулок, назовите это п . Но когда они достигают пзатем они могли поменяться местами назначения и пройти одинаковое общее расстояние. И потом, для них не может быть хуже, если бы они с самого начала шли к местам, где они поменялись местами, вместо того, чтобы использовать п в качестве точки пути, что дает общее расстояние с правой стороны.
Так, сортировка два вне потока порядка элементов в L' делает ее расстояние до ( 1 , 2 , . . . , П ) меньше или же. Повторение этого процесса в конечном итоге отсортирует L . Таким образом, сортировка L по крайней мере, так же хороша, как L' для любого выбора L' , что означает, что она является оптимальной или связана для оптимальной.
Note that the only property of ( 1 , 2 , . . . , П ) that we used is that it's sorted, so the same algorithm would work to permute any given list to minimize its distance to any fixed list.
In the code, the only purpose of z=zip(l,range(len(l)))
is to make the input elements distinct, that is to avoid ties, while keeping the same comparisons between unequal elements. If the input we guaranteed to have no repeats, we could remove this and just have lambda l:map(sorted(l).index,l)
.
v
, будут больше, чем0
? Или, по крайней мере, нет0
?