def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
온라인으로 사용해보십시오!
제로 인덱싱을 사용합니다.
간단한 아이디어를 가진 빠른 알고리즘. 우리가 대신 입력리스트의 순서를 무작위로 바꾸어 넣해야하는 경우에 가까운 그것을 만들기 위해 ( 1 , 2 , . . . , N ) 아래의 입증 가능한 한, 우리는 그저 그것을해야한다. 우리가 대신 치환하는 것 이후 ( 1 , 2 , . . . , N ) , 우리의 내 문제처럼, 입력 목록과 같은 방법을 지시하는 순열을 선택순서화를 모방(반복이있을 수 있습니다 입력 제외). (편집 : 마일은Dennis가동일한 대답을하는이 동일한과제를지적했습니다.)
제 : 리스트의 순열 엘 까지의 거리를 최소화한다 ( 1 , 2 , . . . , N ) 이고 엘 정렬.
증명 : 다른 순열 고려 엘' 의를엘 . 우리는이보다 더 좋을 수 없다 증명 할게요엘 분류.
두 지수 픽업 I , J 있는지 엘' 즉, 아웃 - 오브 - 오더 갖는 경우 나는 < j 하지만 엘'나는> l'제이 . 우리는 그들을 교환하는 것은까지의 거리 증가 할 수 있음을 보여 ( 1 , 2 , . . . , N ) . swap은이 두 요소의 기여를 다음과 같이 변경합니다.
| 엘'나는− i | + | 엘'제이− j | → | 엘'나는− j | + | 엘'제이− i | .
이것이 증가 할 수 없다는 것을 보여주는 깔끔한 방법이 있습니다. 여러 줄에 걸어 두 사람에서 진행 한 고려 엘'나는 에 나는 과에서 다른 엘'제이 에게 제이 . 그들이 걷는 총 거리는 왼쪽의 표현입니다. 이후 나는 < j 하지만 엘'나는> l'제이 , 그들이 그들의 각층 동안 일부 지점에서 교차 호출해야 수단 수직선에 높은 사람 전환 피 . 그러나 그들이 p에 도달하면피그런 다음 목적지를 바꾸고 동일한 총 거리를 걸을 수있었습니다. 그런 다음 피 를 웨이 포인트로 사용하는 대신 처음부터 교체 대상으로 걸어가는 것이 더 나빠질 수는 없습니다 . 이는 오른쪽의 총 거리를 제공합니다.
따라서, 두 개의 비 순차 요소들을 정렬 엘' 로 그 거리를 수 ( 1 , 2 , . . . , N ) 보다 작거나 동일. 이 과정을 반복하면 결국 엘 이 정렬됩니다 . 그래서, 엘 정렬 적어도 좋은으로 엘' 의 선택을위한 엘' 하는 수단을 최적으로 또는 최적의 공동.
참고의 전용 속성 ( 1 , 2 , . . . , N ) 우리가 같은 알고리즘은 어떤 고정 된 목록의 거리를 최소화하기 위해 주어진리스트의 순서를 무작위로 바꾸어 넣 위해 일하는 것이 그래서, 분류 점이다 사용했다고.
코드에서 유일한 목적은 z=zip(l,range(len(l)))입력 요소를 구별, 즉 관계를 피하면서 동일하지 않은 요소를 동일하게 비교하는 것입니다. 반복이 없다고 보장 된 입력을 제거하면이 입력을 제거하고 가질 수 있습니다 lambda l:map(sorted(l).index,l).
v가보다 큼을 보증0합니까? 아니면 적어도 그렇지0않습니까?