인내 정렬
Patience sorting클래스 | 정렬 알고리즘 |
---|---|
데이터 구조 | 배열 |
최악의 경우 공연 | O(n log n) |
베스트 케이스 공연 | O(n); 입력을 미리[1] 정렬할 때 발생 |
컴퓨터 과학에서 인내가 분류되는 것은 카드 게임 인내가 영감을 받아 이름을 붙인 분류 알고리즘이다.알고리즘의 변형은 주어진 배열에서 가장 긴 증가 부속물의 길이를 효율적으로 계산한다.
개요
알고리즘의 이름은 인내 카드 게임의 단순화된 변형에서 유래한다.게임은 뒤범벅이 된 카드들로 시작된다.카드는 다음 규칙에 따라 차례대로 탁자 위에 쌓여 있다.[2]
- 처음에는 말뚝이 없다.처리된 첫 번째 카드는 단일 카드로 구성된 새로운 더미를 형성한다.
- 각각의 후속 카드는 새로운 카드의 값보다 크거나 같은 값을 가진 가장 왼쪽의 기존 더미 또는 모든 기존 더미의 오른쪽에 배치되어 새로운 더미를 형성한다.
- 처리할 카드가 더 이상 남지 않으면 게임은 끝난다.
이 카드 게임은 다음과 같이 2상 분류 알고리즘으로 전환된다.완전히 순서가 지정된 도메인에서 n개의 요소가 배열된 경우 이 배열을 카드 모음으로 간주하고 인내심 정렬 게임을 시뮬레이션하십시오.게임이 끝났을 때 최소 가시 카드를 반복해서 뽑아서 정렬된 순서를 회복하고, 다시 말해 p 말뚝의 k-way 병합을 각각 내부적으로 정리한 것이다.
분석
1단계 인내심 분류인 카드 게임 시뮬레이션은 최악의 경우 O(n log n) 비교를 위해 구현될 수 있다. 즉, 최대 n개의 말뚝이 있을 것이고, 시공에 의해 말뚝의 상단 카드가 왼쪽에서 오른쪽으로 증가하는 순서를 형성하기 때문에 원하는 말뚝을 2진 검색으로 찾을 수 있다.[1]두 번째 단계인 말뚝 병합은 우선순위 대기열을 사용하여 O(n log n) 시간에 수행될 수 있다.[1]
입력 데이터에 자연적인 "실행(runs)" 즉, 감소하지 않는 하위 선(subarrays)이 포함된 경우, 성능은 엄격히 개선될 수 있다.실제로 입력 배열이 이미 정렬된 경우 모든 값이 단일 더미를 형성하고 두 단계 모두 O(n) 시간에 실행된다.평균 사례 복잡성은 여전히 O(n log n): 모든 값의 균일 무작위 시퀀스는 예상된 수의 O(n) 말뚝을 생성하며,[3] 이는 생산과 병합에 O(n log √n) = O(n log n) 시간이 걸린다.[1]
인내심의 실제 성과에 대한 평가는 찬드라무리와 골드스타인에 의해 주어지는데, 이들은 순진한 버전이 그들의 벤치마크 문제에 대한 최첨단 퀵서비스보다 약 10배에서 20배 느리다는 것을 보여준다.그들은 이것을 인내의 종류에 투입된 비교적 적은 양의 연구 때문이라고 보고, 그것의 성과를 퀵소트 2의 요소 내에 가져오는 몇 가지 최적화를 개발한다.[1]
만약 카드의 값이 1, . . . . . n의 범위에 있다면, Van Emde Boas 트리에 의존하여 카드를 더미 속에 넣기 위한 O(n log n) 최악의 실행 시간을 가진 효율적인 구현이 있다.[3]
다른 문제와의 관계
인내심 분류는 플로이드의 게임이라는 카드 게임과 밀접한 관련이 있다.이 게임은 앞서 스케치한 게임과 매우 유사하다.[2]
- 처리된 첫 번째 카드는 단일 카드로 구성된 새로운 더미를 형성한다.
- 각각의 후속 카드는 새로운 카드의 가치 이상이나 그 이상의 가치를 지닌 기존의 일부 더미 또는 기존의 모든 더미 오른쪽에 배치되어 새로운 더미를 형성한다.
- 처리할 카드가 더 이상 남지 않으면 게임은 끝난다.
게임의 목적은 가능한 한 적은 더미로 끝내는 것이다.인내 분류 알고리즘과의 차이점은 새 카드를 허용된 가장 왼쪽의 파일 위에 배치할 필요가 없다는 것이다.인내심 분류는 이 게임을 하기 위한 탐욕스러운 전략이다.
알두스와 디아코니스는 9개 이하의 말뚝을 n = 52에 대한 승리 결과로 정의할 것을 제안한다. n = 52는 대략 5%의 확률로 발생한다.[4]
가장 오래 증가하는 부분 집합을 찾기 위한 알고리즘
먼저 위에서 설명한 대로 정렬 알고리즘을 실행한다.말뚝의 수는 가장 긴 여분의 길이다.카드를 더미 위에 놓을 때마다 이전 더미의 상위 카드에 백 포인터를 놓으십시오(가정할 경우 새 카드보다 값이 낮음).결국, 마지막 더미의 상단 카드에서 백 포인터를 따라 가장 긴 길이의 감소하는 반복을 복구하십시오. 그 역방향은 가장 긴 반복 알고리즘에 대한 대답이다.
S. Bespamyatnikh와 M.Segal은[3] 알고리즘의 효율적인 구현에 대한 설명을 제공하며, 정렬에 대한 추가적인 무증상 비용이 발생하지 않는다(백포인트 저장, 생성 및 통과에는 선형적인 시간과 공간이 필요하므로).그들은 또한 동일한 결과 데이터 구조에서 가장 오랫동안 증가된 모든 부분을 보고하는 방법을 보여준다.
역사
인내의 분류는 C. L. Mallows에 의해 명명되었는데, 그는 1960년대 초 이 발명품의 발명을 A.S.C. Ross의 탓으로 돌렸다.[1]알두스와 디아콘리스에 따르면,[4] 해머슬리가 가장 길게 증가시키는 부분 길이를 계산하기 위한 알고리즘으로 인내가 먼저 인정되었다.[5]틀:축구단 로스, 로버트 W 플로이드는 그것을 분류 알고리즘으로 인식했다.초기 분석은 Mallows에 의해 수행되었다.[6]플로이드의 게임은 플로이드에 의해 도널드 크누스와 통신하여 개발되었다.[2]
사용하다
프로세스 제어에는 인내 정렬 알고리즘을 적용할 수 있다.일련의 측정에서, 오랫동안 증가되는 부분들의 존재는 트렌드 마커로 사용될 수 있다.SQL Server 매거진에 실린 2002년 기사는 이러한 맥락에서 가장 오랫동안 증가된 부분들의 길이에 대한 인내심 분류 알고리즘에 대한 SQL 구현을 포함하고 있다.[7]
참조
- ^ a b c d e f Chandramouli, Badrish; Goldstein, Jonathan (2014). Patience is a Virtue: Revisiting Merge and Sort on Modern Processors (PDF). SIGMOD/PODS.
- ^ a b c Burstein, Alexander; Lankham, Isaiah (2006). "Combinatorics of patience sorting piles" (PDF). Séminaire Lotharingien de Combinatoire. 54A. arXiv:math/0506358. Bibcode:2005math......6358B.
- ^ a b c Bespamyatnikh, Sergei; Segal, Michael (2000). "Enumerating Longest Increasing Subsequences and Patience Sorting". Information Processing Letters. 76 (1–2): 7–11. CiteSeerX 10.1.1.40.5912. doi:10.1016/s0020-0190(00)00124-1.
- ^ a b Aldous, David; Diaconis, Persi (1999). "Longest increasing subsequences: from patience sorting to the Baik-Deift-Johansson theorem". Bulletin of the American Mathematical Society. New Series. 36 (4): 413–432. doi:10.1090/s0273-0979-99-00796-x.
- ^ Hammersley, John (1972). A few seedlings of research. Proc. Sixth Berkeley Symp. Math. Statist. and Probability. Vol. 1. University of California Press. pp. 345–394.
- ^ Mallows, C. L. (1973). "Patience sorting". Bull. Inst. Math. Appl. 9: 216–224.
- ^ Kass, Steve (April 30, 2002). "Statistical Process Control". SQL Server Pro. Retrieved 23 April 2014.
![]() | Wikibook 알고리즘 구현에는 다음과 같은 주제에 대한 페이지가 있다: 인내심 정렬 |