def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
Pruébalo en línea!
Utiliza indexación cero.
Un algoritmo rápido con una idea simple. Si en lugar de necesitamos para permutar la lista de entrada para que sea lo más cercano a ( 1 , 2 , . . . , N ) como sea posible, debemos sólo una especie que, como lo demuestra a continuación. Ya que estamos en lugar permutando ( 1 , 2 , . . . , N ) , se elige la permutación que se ordenaron de la misma forma que la lista de entrada, al igual que en mi reto Imitar un ordenamiento (excepto la entrada puede tener repeticiones). (Editar: millas señaló este desafío más idéntico , donde Dennis tiene esta misma respuesta ).
Reclamación: una permutación de la lista l que minimiza su distancia a ( 1 , 2 , . . . , N ) es l ordenadas.
Prueba: Considere alguna otra permutación l′ de l . Probaremos que no puede ser mejor quel ordenadas.
Elija dos índices i , j que l′ tenga fuera de orden, que es donde i < j pero l′yo> l′j . Se demuestra que el canje de ellos no puede aumentar la distancia a ( 1 , 2 , . . . , N ) . Observamos que swap cambia la contribución de estos dos elementos de la siguiente manera:
El | l′yo- i | + | l′j- j | → | l′yo- j | + | l′j- i | .
Aquí hay una buena manera de mostrar que esto no puede ser un aumento. Considere a dos personas caminando en una recta numérica, una que va de l′yo a yo y la otra de l′j a j . La distancia total que caminan es la expresión de la izquierda. Como i < j pero l′yo> l′j , cambian quién es más alto en la recta numérica, lo que significa que deben cruzar en algún momento durante sus caminatas, llámelo pag . Pero cuando alcanzan pag, podrían intercambiar sus destinos y caminar la misma distancia total. Y luego, no puede ser peor para ellos haber caminado a sus destinos intercambiados desde el principio en lugar de usarpag como punto de referencia, lo que da la distancia total en el lado derecho.
Así, la clasificación de dos elementos de fuera de la orden en l′ que hace que su distancia a ( 1 , 2 , . . . , N ) menor o igual. La repetición de este proceso ordenará l eventualmente. Así, l ordenadas es al menos tan buena como l′ para cualquier elección de l′ , lo que significa que como óptimo o atadas para la óptima.
Tenga en cuenta que la única propiedad de ( 1 , 2 , . . . , N ) que usamos es que está ordenada, por lo que el mismo algoritmo que trabajaría para permutar cualquier lista dada para reducir al mínimo su distancia a cualquier lista fija.
En el código, el único propósito de z=zip(l,range(len(l)))
es hacer que los elementos de entrada sean distintos, es decir, evitar vínculos, mientras se mantienen las mismas comparaciones entre elementos desiguales. Si la entrada que garantizamos no tiene repeticiones, podríamos eliminar esto y simplemente tener lambda l:map(sorted(l).index,l)
.
v
, serán mayores que0
? O, al menos, no0
?