샘플포트

Samplesort

Samplesort는 병렬 처리 시스템에서 자주 사용되는 분할정복 알고리즘분류 알고리즘이다.[1]전통적인 분할 및 정복 정렬 알고리즘은 배열을 하위 인터벤션 또는 버킷으로 분할한다.그런 다음 버킷을 개별적으로 정렬하고 함께 연결한다.그러나 어레이가 균일하지 않게 분포된 경우 이러한 정렬 알고리즘의 성능을 크게 조절할 수 있다.sampleort는 n-element 시퀀스에서 s 크기의 샘플을 선택하고, 샘플을 정렬하여 버킷의 범위를 결정하고, 결과에서 p-1 < s 요소를 선택하여 이 문제를 해결한다.이러한 요소(스플리터라고 함)는 배열을 대략적으로 동일한 크기의 버킷 p로 나눈다.[2]샘플포트는 W. D. Frazer와 A. C. McKellar의 1970년 논문 "샘플포트: 최소 저장 트리 정렬에 대한 샘플링 접근법"에 설명되어 있다.[3]

알고리즘.

견본은 퀵소트의 일반화다.퀵소트가 피벗이라는 단일 값에 기초하여 각 단계에서 입력을 두 부분으로 분할하는 경우, 샘플소트는 대신 입력에서 더 큰 샘플을 가져오고 그에 따라 데이터를 버킷으로 나눈다.퀵소트처럼 양동이를 재귀적으로 정렬한다.

견본 구현을 구상하려면 버킷 p의 개수를 결정해야 한다.이 작업이 완료되면 실제 알고리즘은 다음과 같은 세 가지 단계로 작동한다.[4]

  1. 입력(스플리터)에서 p-1 원소를 샘플링한다.이러한 항목을 정렬하고, 각 인접한 분할자 쌍은 버킷을 정의한다.
  2. 데이터를 반복하여 각 요소를 적절한 버킷에 배치하십시오(이 말은 멀티프로세서 시스템에서 프로세서로 전송).
  3. 각 버킷을 정렬하십시오.

전체 정렬된 출력은 버킷의 연결이다.

공통 전략은 p를 사용 가능한 프로세서 수와 동일하게 설정하는 것이다.그런 다음 데이터는 프로세서 간에 분산되어 다른 순차 정렬 알고리즘을 사용하여 버킷 정렬을 수행한다.

가성음

다음 목록은 위에서 언급한 3단계 알고리즘을 가성으로 보여주고 알고리즘이 원칙적으로 어떻게 작동하는지 보여준다.[5]다음에서 A는 비정렬 데이터, k는 과표본 인자, p는 분할자의 수이다.

만약 평균 양동이 크기 모두에게 문턱 스위치 아래에 있quicksort 만약 n/k<>기능 sampleSort(A[1..n], k, p).;{\displaystyle n/k<.}한곈 다음/* 1단계*/smallSort(A)S)[S1,…, S(p− 1)k]무작위로//select샘플와는 아주{S=[S_{1}{(p-1)k,S_ ,\dots}]\displaystyle}을 선택합니다 //.rt S// sort sample      // select splitters     /* Step 2 */     for each          find j sUch이 sj− 1<>;s≤ j{\displaystyle s_{j-1}<, a\leq s_{j}} 곳에 양동이 bj{\displaystyle b_{j}}/* 3단계와 적은 연쇄 */ 복귀 이어진(sampleSort(b1), …,sampleSort(bkm그리고 4.9초 만)){\displaystyle{\texttt{결부시키다}}({\texttt{sampleSort}}(b_{1}),.\dots

사이비 코드는 원래의 프레이저와 맥켈라 알고리즘과는 다르다.[3]사이비 코드에서는 샘플ort를 재귀적으로 부른다.Frazer와 McKellar는 단 한 번 sampleort에 전화를 했고, 이후의 모든 반복에서 퀵소트를 사용했다.

복잡성

프로세서와 병렬 구현을 위한 복잡성(Big O 표기법):

스플리터를 찾아라.

양동이로 보내세요.

노드를위한 O ) {\ O
log ()을(를) 브로드캐스트에 사용
p ( p) 모든 키에 대한 이진 검색
p) 클릭하여 버킷으로 키를 전송하십시오.

버킷을 정렬하십시오.

( ( p {n 여기서 c (는 기본 순차 정렬 방법의 복잡성이다.[1]c () = log ( ) .

이 알고리즘에 의해 수행된 비교 횟수는 큰 입력 시퀀스에 대한 정보 이론적 최적 에 접근한다.Frazer와 McKellar에 의해 수행된 실험에서 알고리즘은 퀵소트보다 15% 적은 비교가 필요했다.

데이터 샘플링

데이터는 다른 방법을 통해 샘플링될 수 있다.일부 방법에는 다음이 포함된다.

  1. 균일한 간격으로 샘플을 채취한다.
  2. 랜덤하게 선택한 표본을 선택하십시오.

오버샘플링

과표본 비율은 분할자를 결정하기 전에 표본으로 추출할 데이터 요소의 수를 결정한다.목표는 데이터의 분포를 잘 표현하는 것이다.중복된 값이 많지 않다는 점에서 데이터 값이 광범위하게 분포되어 있다면 작은 표본 추출비로 충분하다.그 밖의 분포에 중복이 많은 경우에는 더 큰 과표본 비율이 필요할 것이다.이상적인 경우, 2단계 이후 각 버킷에는 / 요소가 포함되어 있다.이 경우 모든 버킷의 크기가 같기 때문에 다른 버킷보다 정렬하는 데 시간이 오래 걸리지 않는다.

이상의 k 샘플을 채취한 후 샘플이 정렬된다.Thereafter, the splitters used as bucket boundaries are the samples at position of the sample sequence (together with and as left and right boundaries for the left most and right most buckets respecti이것은 단순히 splitter를 무작위로 선택하는 것보다 좋은 분할자에게 더 나은 휴리스틱을 제공한다.

버킷 크기 추정치

결과 표본 크기로 예상 버킷 크기 및 특히 버킷이 특정 크기를 초과할 확률을 추정할 수 있다.The following will show that for an oversampling factor of the probability that no bucket has more than elements is larger than 스타일 .

이를 표시하기 위해e ,… , n {\1},\을(를) 정렬된 시퀀스로 입력하도록 하십시오.프로세서가(+ ) / )\ n 이상의 요소를 얻으려면 길이 +)n / p{\)\n/의 입력에 연속성이 있어야 하며 이 중 최대 S 샘플이 선택된다.이러한 경우는 P 확률을 구성한다이를 랜덤 변수로 나타낼 수 있다.

의 예상 값에 대해 다음을 유지하십시오.

값은 p l :

지금 Chernoff 바인딩을 사용하여 다음과 같이 표시할 수 있다.

많은 동일한 키

동일한 키가 많은 경우 알고리즘은 전체 시퀀스가 동일한 키로 구성되기 때문에 시퀀스가 정렬되는 많은 반복 레벨을 거친다.이것은 평등 양동이를 도입함으로써 상쇄될 수 있다.피벗과 동일한 요소는 각각의 평등 버킷으로 분류되며, 이는 하나의 추가 조건 분기로만 구현될 수 있다.평등 양동이는 더 이상 분류되지 않는다./ 이상 발생하는 키가 피벗이 될 가능성이 높기 때문에 이 작업이 가능하다.

병렬 시스템에서 사용

= 프로세서와 = 의 오버샘플링 계수 예제

샘플포트는 대량 동기 병렬 기계와 같은 분산 시스템을 포함하여 병렬 시스템에서 자주 사용된다.[6][4][7]스플리터의 가변적인 양 때문에(Quicksort에서 하나의 피벗만 사용하는 것과는 대조적으로), 샘플포트는 병렬화 및 스케일링에 매우 적합하고 직관적이다.더욱이 샘플포트 또한 퀵소트 등의 구현보다 캐시 효율적이다.

병렬화는 각 프로세서 또는 노드에 대해 정렬을 분할하여 구현되는데, 여기서 버킷의 수는 개 프로세서수와 동일하다. 각 프로세서가 대략 동일한 np {\/p}을 받기 때문에 샘플 포트는 병렬 시스템에서 효율적이다 버킷이 그러하므로동시에, 프로세서는 거의 동시에 정렬을 완료할 것이며, 따라서 프로세서가 다른 프로세서를 기다릴 필요가 없다.

분산 시스템에서 분할자는 각 프로세서의 요소를 가져와서 결과 p 요소를 분산 정렬하고 -th 요소마다 가져가고 결과를 모든 프로세서에 브로드캐스트하여 선택한다.This costs for sorting the elements on processors, as well as for distributing the chosen splitters to 프로세서.

결과 분할기로 각 프로세서는 자체 입력 데이터를 로컬 버킷에 배치한다. 작업은 이진 검색으로 / p log ) { p이(가) 필요하다.이후 로컬 버킷이 프로세서로 재배포된다.프로세서 은(는) 다른 모든 프로세서의 로컬 버킷 를 가져와 로컬로 정렬한다.배포에는 , ) 시간이 소요되며 여기서 가장 큰 버킷의 크기입니다.로컬 정렬은 (.

1990년대 초 Connection Machine 슈퍼컴퓨터에서 수행된 실험에서는 샘플이 프로세서 간 통신 오버헤드를 거의 유발하지 않기 때문에 이러한 기계에서 대규모 데이터셋을 분류하는 데 특히 뛰어난 것으로 나타났다.[8]후자의 GPU에서는 알고리즘이 대안보다 덜 효과적일 수 있다.[9][citation needed]

샘플 포트의 효율적인 구현

Super Scalar Samplesort의 애니메이션 예.각 단계에서 비교되는 숫자는 파란색으로 표시되고, 그렇지 않으면 읽거나 쓴 숫자는 빨간색으로 표시된다.

위에서 설명한 대로 샘플포트 알고리즘은 선택된 분할자에 따라 요소를 분할한다.효율적인 구현 전략은 "Super Scalar Sample Sort"[5]라는 논문에서 제안된다.본 문서에서 제안한 구현은 효율적인 구현을 위해 n n n두 어레이(입력 데이터와 임시 어레이를 포함하는 원래 어레이)를 사용한다.따라서 이 구현 버전은 인플레이스 알고리즘이 아니다.

각 재귀 단계에서 데이터는 분할된 방식으로 다른 배열로 복사된다.마지막 재귀 단계에서 데이터가 임시 배열에 있으면 데이터가 원래 배열에 다시 복사된다.

버킷 결정

비교 기반 정렬 알고리즘에서 비교 연산은 가장 성능에 중요한 부분이다.샘플 포트에서 이는 각 요소의 버킷을 결정하는 것과 일치한다.이 작업에는 각 에 대해 k 시간이 필요하다.

Super Scalar Sample Sort는 배열 t에 암시적으로 저장된 균형 잡힌 검색 트리를 사용한다.루트는 0에 저장되고 i 의 왼쪽 계승자는 2}에 저장되며