팀 정렬-들어 본 적이없는 가장 빠른 정렬 알고리즘

원래 6 월 26 일에 브랜든에 의해 게시 2018 127,741 읽기

에 대한 마크 센드라 마르토렐의 사진 팀소트:학계에서는 구축되지 않은 실제 세계를 위해 만들어진 매우 빠르고 안정적인 정렬 알고리즘.

업데이트 된 문서를 보려면 여기를 클릭하십시오:

여기에서 팀 피터 이미지

팀소트 는 실제 데이터에 효율적이며 학술 실험실에서 생성되지 않은 정렬 알고리즘입니다. 팀 피터스는 2001 년 파이썬 프로그래밍 언어를 위한 팀소트를 만들었다. 먼저 정렬하려는 목록을 분석 한 다음 목록 분석을 기반으로 접근 방식을 선택합니다.

알고리즘이 발명 된 이후 파이썬,자바,안드로이드 플랫폼 및 옥타브에서 기본 정렬 알고리즘으로 사용되었습니다.예를 들어,두 개의 로그가 있습니다. 빅 오 표기법에 대해 알아 보려면,이 읽기.

여기에서

팀 정렬의 정렬 시간은 병합 정렬과 동일하며,이는 다른 대부분의 정렬보다 빠릅니다. 팀 정렬은 실제로 삽입 정렬 및 병합을 사용합니다.

피터스는 대부분의 실제 데이터 세트에 존재하는 이미 정렬 된 요소를 사용하도록 팀 정렬을 설계했습니다. 이러한 이미 정렬 된 요소를”자연 실행”이라고 부릅니다. 요소를 실행으로 수집하는 데이터를 반복하고 동시에 이러한 실행을 하나로 병합합니다.

배열에 64 개 미만의 요소가 있습니다.

정렬하려는 배열에 64 개 미만의 요소가 있으면 팀 정렬은 삽입 정렬을 실행합니다.

삽입 정렬은 작은 목록에서 가장 효과적인 간단한 정렬입니다. 그것은 큰 목록에서 매우 느리지 만,작은 목록 매우 빠릅니다. 삽입 정렬의 아이디어는 다음과 같습니다:

  • 요소를 하나씩 봐
  • 올바른 위치에 요소를 삽입하여 정렬 된 목록 작성

다음은 삽입 정렬이 목록을 정렬하는 방법을 보여주는 추적 테이블입니다

내 웹 사이트 스케릿에서 찍은 이미지.기술

이 경우 새로 정렬 된 요소를 배열 시작 부분에서 시작하는 새 하위 배열에 삽입합니다.

여기에 삽입 정렬을 보여주는 지프가 있습니다.:

여기에서 촬영

실행에 대한 자세한

목록이 알고리즘보다 64 개 요소보다 큰 경우 엄격하게 증가 또는 감소하는 부분을 찾고 목록을 통해 첫 번째 패스를 만들 것입니다. 부분이 감소하는 경우,그 부분을 반전 할 것이다.

따라서 실행이 감소하면 다음과 같이 표시됩니다(실행이 굵게 표시됨).:

내 웹 사이트의 이미지,스케릿.기술

감소하지 않으면 다음과 같습니다:

내 웹 사이트의 이미지,스케릿.기술

민런은 배열의 크기에 따라 결정되는 크기입니다. 알고리즘은 임의의 배열에서 대부분의 실행이 길이가 되거나 최소 실행이 되도록 선택합니다. 2 개의 배열을 병합하는 것은 실행 수가 2 의 거듭 제곱과 같거나 약간 적을 때 더 효율적입니다. 팀소트에서는 민룬이 2 의 거듭 제곱과 같거나 작은지 확인함으로써 이 효율을 보장하기 위해 민룬을 선택합니다.

알고리즘은 32 에서 64 사이의 범위에서 최소 실행을 선택합니다. 원래 배열의 길이를 민룬으로 나눈 값이 2 의 제곱과 같거나 약간 작도록 민룬을 선택합니다.

실행의 길이가 최소 실행보다 작으면 최소 실행에서 벗어난 실행의 길이를 계산합니다. 이 새 번호를 사용하면 실행보다 앞서 많은 항목을 잡고 삽입 정렬을 수행하여 새 실행을 만듭니다.

따라서 최소 실행이 63 이고 실행 길이가 33 이면 63-33=30 을 수행합니다. 그런 다음 실행의 끝 앞에서 30 요소를 잡아,그래서이 실행에서 30 항목이며,다음 새 실행을 만들 삽입 정렬을 수행합니다.

이 부분이 완료되면 이제 목록에 정렬 된 런이 많이 있어야합니다.

병합

이제 실행을 병합하기 위해 병합 정렬을 수행합니다. 그러나 팀 정렬은 병합 정렬 중에 안정성을 유지하고 균형을 병합합니다.

안정성을 유지하기 위해 우리는 동일한 가치의 두 숫자를 교환해서는 안됩니다. 이렇게 하면 목록의 원래 위치를 유지할 뿐만 아니라 알고리즘이 더 빨라질 수 있습니다. 우리는 곧 병합 균형에 대해 논의 할 것입니다.

팀 정렬이 실행을 찾으면 스택에 추가됩니다. 간단한 스택은 다음과 같습니다:

내 웹 사이트의 이미지,스케릿.기술

판의 스택을 상상해보십시오. 당신은 바닥에서 접시를 취할 수 없습니다,그래서 당신은 상단에서 그들을 가지고해야합니다. 스택에 대해서도 마찬가지입니다.

팀 정렬은 병합 정렬이 실행될 때 두 가지 경쟁 요구 사항의 균형을 맞추려고합니다. 한편,우리는 나중에 올 수 있습니다 패턴을 이용하기 위해 가능한 한 오랫동안 병합을 지연하고 싶습니다. 그러나 우리는 실행이 메모리 계층 구조에서 여전히 높은 발견 실행을 악용 가능한 한 빨리 병합을 할 더 싶습니다. 또한 병합되지 않은 실행을 기억하기 위해 메모리를 소비하고 스택의 크기가 고정되어 있기 때문에”너무 오래”병합을 지연시킬 수 없습니다.

이 절충안을 만들기 위해 팀소트는 스택에서 가장 최근 항목 3 개를 추적하고 이러한 항목에 대해 반드시 적용되는 두 가지 법칙을 만듭니다.

1. >비+기음

2. 이 경우 스택에서 가장 최근의 세 항목입니다.

팀 피터스 자신의 말로:

좋은 타협으로 밝혀진 것은 스택 엔트리에 두 개의 불변성을 유지합니다. 더 어려운 것은 우리가 안정성을 유지해야한다는 것입니다. 이 문제를 해결하기 위해 팀 정렬은 임시 메모리를 따로 설정합니다. 두 개의 실행 중 더 작은 것(둘 다 실행 호출 ㅏ 과 비)을 임시 메모리에 넣습니다.

질주

한 번의 실행이 여러 번 연속으로”승리”되었음을 알 수 있습니다. 실행이 실행보다 완전히 더 작은 숫자로 구성되어 있다는 것이 밝혀진 경우 비 다음 실행은 원래 위치로 돌아갑니다. 두 실행을 병합하는 것은 아무것도 달성하지 많은 작업을 포함 할 것이다.

종종 데이터는 기존의 내부 구조를 갖습니다. 만약 많은 수의 값이 실행 비의 값보다 낮다면,그 값은 계속 비보다 더 작은 값을 가질 가능성이 있다.

내 웹 사이트의 이미지,스케릿.기술. 실행은 엄격하게 증가 또는 감소해야하므로 왜이 숫자가 선택되었는지 알 수 있습니다.그런 다음 질주 모드로 전환됩니다. 이 방법으로 팀 정렬은 전체 섹션을 제자리로 이동할 수 있습니다. 팀 정렬은 비의 전체 섹션을 한 번에,그리고 제자리로 이동합니다.

이 작업을 보자. Timsort 검사 B(5)및 이진 검색을 사용하여 그것은 외모에 대한 정확한 위치에서 A.

론,B 속에서 다시 목록 A. 이제 Timsort 검사(1)에서의 정확한 위치 나.그래서 우리가 어디에 볼 수 1 갑니다. 이 숫자는 비의 시작 부분에 있습니다.우리는 이제 비의 끝에 속하고 비의 시작 부분에 속한다는 것을 알고 있습니다.

이 작업은 적절한 위치가 시작 부분에 매우 가깝거나 그 반대의 경우 가치가 없습니다. 이 돈을 지불하지 않는 경우 그래서 갤럽 모드는 신속하게 종료됩니다. 또한,팀 소트는 메모를 받아 어렵게 입력해야하는 연속 전용 또는 비 전용 승리의 수를 증가시켜 나중에 갤럽 모드를 입력 할 수 있습니다. 갤럽 모드가 돈을 지불하는 경우,팀 정렬은 쉽게 다시 입력 할 수 있습니다.

요컨대,팀 정렬은 2 가지를 믿을 수 없을 정도로 잘합니다:

  • 기존 내부 구조를 가진 배열에서 뛰어난 성능
  • 안정적인 정렬을 유지할 수 있음

이전에는 안정적인 정렬을 달성하기 위해 목록의 항목을 정수로 압축하여 튜플 배열로 정렬해야합니다.

코드

코드에 관심이 없다면,이 부분을 건너 뛰십시오. 이 섹션 아래에 더 많은 정보가 있습니다.

아래의 소스 코드는 광산과 난다 자바르마의 작업을 기반으로합니다. 소스 코드는 완전하지 않으며 파이썬의 공식 정렬()소스 코드와 유사합니다. 이것은 내가 팀 정렬의 일반적인 느낌을 얻기 위해 구현 한 멍청한 팀 정렬 일뿐입니다. 당신은 모든 영광 팀 소트의 원본 소스 코드를보고 싶다면,여기를 체크 아웃. 이것은 파이썬이 아니라 공식적으로도 구현됩니다.

팀 정렬은 실제로 파이썬에 바로 내장되어 있으므로이 코드는 설명자 역할 만합니다. 단순히 쓰기:

list.sort()

또는

sorted(list)

팀소트가 어떻게 작동하는지 마스터하고 그것에 대한 느낌을 얻고 싶다면,나는 당신이 그것을 직접 구현하려고 노력하는 것이 좋습니다!

이 문서는 팀 소트에 팀 피터스의 원래 소개를 기반으로,여기.

이 기사가 마음에 드십니까? 모든 것을 논의하기 위해 소셜 미디어에 나와 함께 연결 컴퓨터 과학 관련 2019

답글 남기기

이메일 주소는 공개되지 않습니다.

More: