깔때기 소트
Funnelsort![]() |
We Fannelsort는 비교 기반의 정렬 알고리즘입니다.이 알고리즘은 mergesort와 비슷하지만 정렬할 요소의 수가 너무 많아 작업이 수행되는 캐시에 맞지 않는 설정을 위해 설계된 캐시 오류 알고리즘입니다.1999년 Matteo Frigo, Charles Leiserson, Harald Prokop 및 Sridhar Ramachandran에 의해 캐시 인식 [1][2]모델의 맥락에서 도입되었습니다.
수학적 특성
외부 메모리 모델에서는 캐시 가이고 행 길이가인 머신에서의 항목({N을 실행하기 위해 필요한 메모리 전송의 수는 O Z { O {N}) 입니다. Z ({ Z ( 라고 큰 캐시 가정하에서.이 메모리 전송 횟수는 비교 정렬에 점근적으로 최적인 것으로 나타났습니다.또한 Punnelsort는 점근적으로 최적의 런타임 복잡도 N \ \ N)}를 실현합니다.
알고리즘.
기본적인 개요
Fannelsort는N개의 요소(\ N의 배열로 동작합니다.요소를 정렬하려면 다음 작업을 수행합니다.
- 을 3({ N의 3 N3 로 분할하여 어레이를 재귀적으로 정렬합니다.
- 13 N를 하여 정렬된 1/({ N 시퀀스를 병합합니다.(이 프로세스에 대해서는, 한층 더 자세하게 설명합니다.
Fannelsort는 몇 개의 서브어레이가 재귀적으로 정렬되고 그 후에 Marge 스텝이 서브어레이를 하나의 정렬된 배열로 결합한다는 점에서 Marge Sort와 유사합니다.병합은 k-merger라고 불리는 장치에 의해 수행됩니다.이것에 대해서는, 다음의 항에서 설명합니다.
k자형
k-merger는의 정렬된 시퀀스를 .k-merger가 1회 호출되면 k개의 입력 시퀀스를 병합하여 얻은 정렬 시퀀스의 첫 k 요소가 출력됩니다.
최상위 레벨에서는 길이 스타일 N의 N3 에 N1( N^{})의 Merger를 사용하여 이 마지를 1회 호출합니다.
k-merger는재귀적으로 구축됩니다k displaystyle\ - }, \ 및 단일 k(\{\ {krt {krt {krt { {krt})로 됩니다k개의 입력은 각각의k개의 k개의 \개의 입력 세트로 됩니다.이들 세트는 각각 입력 Marge의 1개의 입력입니다.각 입력 병합의 출력은 2k 를 유지할 수 있는 FIFO 큐인 버퍼에 연결됩니다.버퍼는 순환 큐로 구현됩니다. { 버퍼의 출력은 출력 O O의 입력에 연결됩니다. 마지막으로O(\ O의 출력은 k-merger 전체의 출력입니다.
이 구조에서는 입력 Marge는 k / k 항목만 한 에 출력하지만 출력하는 버퍼의 공간은 2배가 됩니다.이것은 버퍼에 아이템이 충분하지 않은 경우에만 입력 Marge를 호출할 수 있도록 하기 위해 이루어지며, 버퍼가 호출되었을 때 많은 아이템(3/ k을 한 번에 출력합니다.
k-merger는 다음과 같은 방법으로 재귀적으로 동작합니다.요소({3})를 출력하기 위해 출력 2({ k2}})를 재귀적으로 호출합니다.단 에콜을 발신하기 전에 모든 버퍼를 체크하고 절반 미만의 버퍼를 채웁니다.i번째 버퍼를 채우기 위해 대응하는 입력 를 1회 반복 호출합니다.(머지 입력이 부족하여) 이 작업을 수행할 수 없는 경우 이 단계를 건너뜁니다.이 콜은 3/ { k^ { / }개의 요소를 하므로 버퍼에는 3/ { k^ { / }개 의 요소가 포함됩니다.이러한 모든 조작이 종료되면 k-merger는 입력 중 첫 번째 3})를 정렬된 순서로 출력합니다.
분석.
이 알고리즘의 분석의 대부분은 k-merger의 공간 및 캐시 누락 복잡성을 분석하는 것을 중심으로 이루어집니다.
첫 번째 중요한 경계는 k-merger가 O2 O 공간에 수 있다는 것입니다.이를 확인하기 위해 S(k) \ S ( )는 k-merger에 필요한 공간을 나타냅니다.가 3/ k1/2 버퍼에 맞추려면 O 2 O 공간이 합니다.+ {의 작은 버퍼에는 (+)s따라서 공간은 S ( ) S + 2){ S)= S를 만족합니다.이 반복에는 S 2){ S)=가 있습니다.
최대 Z 크기의 문제가 완전히 캐시에 들어갈 수 있는 양의 (\\alpha)가 존재하므로 추가 캐시 누락이 발생하지 않습니다.
M( ){ Q { ( ) denote k 、 Q ) ( ( k Z)/L ) . { Q_ () _ { 3 }베이스 케이스로서 k Z kalpha {가 .k가 클 경우 - merger를 호출하는 횟수를 제한할 수 있습니다. 결합은 정확히 k회)라고 불립니다.입력 머지 콜의 총수는 k / + k({ k{\입니다.이것에 의해, 2 3 / + k({{\의 재귀 콜이 .또한 알고리즘은 모든 버퍼를 체크하여 채워야 하는지 여부를 확인합니다.는 k 32 k의 매 스텝마다 kdisplaystyle {\ {k 버퍼에 수행되므로 모든 체크에서 최대 k의 캐시 이 발생합니다.
로 인해 Q M( )( ( 2 / + )M () + k ( \ Q _ { } ( ) \ ( 2 { 3 / 2} + \ {} )가 반복됩니다.이러한 용액은 상기의 용액을 나타내고 있는 것을 알 수 있습니다.
마지막으로 전체 정렬의 캐시 누락 ( ) \ Q (N )를 분석할 수 있습니다. 값은 반복Q) 1/(2 /3) (1 /).{ Q(N)= +M}(를 충족합니다.} 이것은 (N )= ( ( / ) Z) . { ( / L ) = O ( ( ( ( N / ) \ _ { Z }N )
느릿느릿한 깔때기 소트
게으른 깔때기 [3]소트는 2002년 거스 스톨팅 브로달과 롤프 파거버그가 도입한 깔때기 소트의 변형입니다.변경사항은 Marge가 호출될 때 각각의 버퍼를 채울 필요가 없다는 것입니다.대신 버퍼가 비어 있을 때만 버퍼가 느릿느릿 채워집니다.이 수정은 원래 깔때기와 동일한 점근 런타임 및 메모리 전송을 가지지만, 분산 스위핑이라고 알려진 방법으로 계산 기하학 문제에 대한 캐시 오비어 알고리즘에 응용 프로그램이 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ M. Frido, C.E. Leiserson, H. Prokop 및 S. Ramachandran.캐시 오비어스 알고리즘제40회 컴퓨터 과학 기초에 관한 IEEE 심포지엄(FOCS 99), 페이지 285-297.1999.IEEE, Citeser에서 확장 추상화.
- ^ 하랄드 프로캅.캐시 오비셔스 알고리즘석사논문, MIT 1999.
- ^ 긴 기술 보고서도 참조하십시오Brodal, Gerth Stølting; Fagerberg, Rolf (25 June 2002). "Cache Oblivious Distribution Sweeping". Automata, Languages and Programming. Lecture Notes in Computer Science. Vol. 2380. Springer. pp. 426–438. CiteSeerX 10.1.1.117.6837. doi:10.1007/3-540-45465-9_37. ISBN 978-3-540-43864-9..