문제

Timsort라는 블록에 (비교적) 새로운 종류가 있습니다. Python의 List.Sort로 사용되었으며 이제 Java 7의 새로운 배열.

거기 있습니다 일부 문서 그리고 a 작은 위키 백과 기사 종류의 높은 수준의 속성과 낮은 수준의 성능 평가를 설명하지만, 누군가가 Timsort가하고있는 일을 정확하게 설명하기 위해 일부 의사 코드를 제공 할 수 있고, Zippy를 만드는 주요 일을 설명 할 수 있는지 궁금했습니다. (인용 된 논문과 관련하여 "낙관적 분류 및 정보 이론적 복잡성")

(또한보십시오 관련 stackoverflow 게시물.)

도움이 되었습니까?

해결책

현재 삭제 된 블로그 게시물에서 관련 부분을 인용합니다. 정렬 알고리즘 시각화 : Python의 Timsort

Timsort의 비즈니스 엔드는 사전 분류 된 요소의 달리기에서 작동하는 Mergesort입니다. 최소 실행 길이 Minrun은 최종 병합이 가능한 한 균형을 이루도록 선택됩니다. 64 개의 요소의 경우 Minrun은 32 세가됩니다. 병합이 시작되기 전에 데이터를 통해 하나의 통과가 이루어집니다. 집단. 하강 런은 단순히 그것들을 제자리에 바꾸어 처리합니다. 결과 실행 길이가 Minrun보다 작 으면 삽입 정렬을 사용하여 Minrun으로 향상됩니다. 기존 실행이 심각한 셔플 배열 에서이 프로세스는 위의 추측과 똑같이 보입니다. Merge 정렬과 병합하기 전에 삽입 정렬을 사용하여 Minrun 요소의 사전 분류 블록.

[...]

  • Timsort는 내림차순 실행을 발견하고 실행을 내내 뒤집습니다. 이것은 포인터의 배열에서 직접 이루어 지므로 우리의 유리한 지점에서 "즉각적인"것 같습니다.
  • 실행은 이제 삽입 정렬을 사용하여 길이의 Minrun까지 향상됩니다.
  • 다음 블록의 시작 부분에는 실행이 감지되지 않으며 삽입 정렬은 전체 블록을 정렬하는 데 사용됩니다. 이 블록의 하단에 정렬 된 요소는 특별히 처리되지 않습니다. Timsort는 블록의 중간에서 시작되는 실행을 감지하지 않습니다.
  • 마지막으로 Mergesort는 달리기를 병합하는 데 사용됩니다.

다른 팁

이 변화는 코어-리브 메일 링리스트 들어 왔을 때 약간의 토론과 유용한 링크가 있습니다. 여기에 있습니다 웹 개정 코드 검토 변경 및 오리지널 패치.

코드의 의견은 다음과 같습니다.

구현 참고 :이 구현은 안정적이고 적응 적이며
N LG (N)보다 훨씬 적은 수준의 반복적 인 Mergesort
입력 배열이 부분적으로 정렬되면
입력 배열이있을 때 기존의 Mergesort의 성능
무작위로 주문했습니다. 입력 배열이 거의 정렬되면
구현에는 대략 N 비교가 필요합니다.
임시 저장소 요구 사항은 거의 정렬 된 경우 작은 상수마다 다릅니다.
무작위로 주문한 입력에 대한 N/2 객체 참조에 대한 입력 배열
배열.

구현은 오름차순을 동등하게 활용합니다
입력 배열의 내림차순 순서를 이용할 수 있습니다.
동일한 다른 부분에서 오름차순 및 내림차순 순서
입력 배열. 두 개 이상의 분류 된 배열을 병합하는 데 적합합니다.
배열을 연결하고 결과 배열을 정렬하십시오.
구현은 Python 용 Tim Peters의 목록 정렬에서 조정되었습니다.
Timsort. Peter McIlroy의 "낙관적 인 기술을 사용합니다
정렬 및 정보 이론적 복잡성 ",
이산 알고리즘에 관한 제 4 회 ACM-SIAM 심포지엄, pp 467-474,
1993 년 1 월.

거기에 묻혔습니다 Python 구현 세부 사항에 대한 매우 유용한 링크, 그리고 나는 그것이 시작하기에 좋은 곳이라고 생각합니다. 그것에 대해 엄청나게 높은 수준이 되려면, Timsort는 정렬 된 데이터를 주목하고 정렬 중에 해당 구조를 활용하여 성능을 향상시킵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top