깔때기 소트

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 배열로 동작합니다.요소를 정렬하려면 다음 작업을 수행합니다.

  1. 3({ N 3 N3 로 분할하여 어레이를 재귀적으로 정렬합니다.
  2. 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가 호출될 때 각각의 버퍼를 채울 필요가 없다는 것입니다.대신 버퍼가 비어 있을 때만 버퍼가 느릿느릿 채워집니다.이 수정은 원래 깔때기와 동일한 점근 런타임 및 메모리 전송을 가지지만, 분산 스위핑이라고 알려진 방법으로 계산 기하학 문제에 대한 캐시 오비어 알고리즘에 응용 프로그램이 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ M. Frido, C.E. Leiserson, H. Prokop 및 S. Ramachandran.캐시 오비어스 알고리즘제40회 컴퓨터 과학 기초에 관한 IEEE 심포지엄(FOCS 99), 페이지 285-297.1999.IEEE, Citeser에서 확장 추상화.
  2. ^ 하랄드 프로캅.캐시 오비셔스 알고리즘석사논문, MIT 1999.
  3. ^ 긴 기술 보고서도 참조하십시오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..