블랙 박스를 사용하여 정렬


20

우리는 목록 정렬한다고 가정 n 개의 실수를. 우리가 정렬 할 수있는 블랙 박스가 있다고 가정합니다 Sn실수 n 개 . 이 블랙 박스를 사용하면 얼마나 많은 이점을 얻을 수 있습니까?n

예를 들어 숫자 만 블랙 박스에 전화합니까? 내가 찾은 최고의 알고리즘은 블랙 박스에 대한n 개의호출을사용합니다. 그러나 나는 그것을 더 향상시킬 수 없었습니다. 다음은 merge-sort와 비슷한 알고리즘입니다.O(n)n

먼저 목록 로 분할하십시오.Ss1,s2,을나열합니다. . . ,sn대략√의 ns1,s2,...,sn 사이즈 그런 다음 √를 사용하십시오.n 블랙 박스를 호출하여이 목록을 정렬합니다. 마지막으로 다음과 같이 블랙 박스를 사용하여 정렬 된 목록을 병합하십시오.n

목록의 가장 작은 요소를 새 목록 에 넣고 블랙 박스를 호출하여 정렬하십시오. 안의 숫자는 L [ 1 ] (제 1 및 작은 원소 L가 )의 최소 수있을 것이다 S . 출력리스트의 첫 번째 위치에 넣을 수 있습니다. 요소를 가정하면로부터 선택되어 S 개의 J , 우리는 대체 L [ 1 ] 정렬리스트의 두 번째 최소의 요소 S J , 다시 두 번째 최소의 부재를 계산하는 데에 블랙 박스를 실행 S를 .LL[1]LS
sjL[1]sjS
모든 요소가 정렬 될 때까지 계속합니다. 이 부분에 대한 총 블랙 박스 통화 수는 . 따라서 전체 총 통화 수는n입니다.nnn

반면에 다음과 같이 정렬에 필요한 숫자 비교에서 하한을 사용하여 하한을 얻을 수있는 것처럼 보입니다. √를 사용하여 블랙 박스를 구현할 수 있습니다비교. o로문제를 해결할 수 있다면(nlgn=12nlgn블랙 박스를 호출하고 선형 시간으로 병합하면 불가능한o(nlgn)비교로n개의실수를정렬 할 수 있습니다.o(n)no(nlgn)

블랙 박스에서 사용되는 많은 비교가 공유되므로 우리의 주장에 다시 설명되기 때문에 이 블랙 박스 호출 횟수의 하한 임을 증명할 수 있다고 생각 합니다.Ω(n)

업데이트 : 다른 게시물에서 알 수 있듯이 도 달성 할 수 있습니다.nlgn


2
댓글에 오타가있는 것 같습니다. " 보다 작은 알고리즘을 사용하지 않는 알고리즘"기계에 대한 N 호출은NlgN미만의비교로N실수를정렬 할 수 있습니다"? ps :NlgN하한은 비교 기반 정렬 알고리즘에만 적용된다는 사실에주의해야합니다.NNNlgNNlgN
Kaveh

8
우리도 O를 얻을 수 있다고 생각합니다 ( AKS의 정렬 네트워크를 사용합니다. 그들의 네트워크는 블랙 박스가 크기 2의 블록을 정렬 할 수있는 모델의 인스턴스화로 생각할 수 있습니다. 그들의 알고리즘은O(logn)라운드를 사용하며, 각 라운드는 2 소터O(n)를호출합니다. O(n)2- 분류기의 하나의 "라운드"는O(O(nlogn)O(logn)O(n)O(n)O(n) 분류기. n
Vinayak Pathak

6
@VinayakPathak : 입력 데이터를 2 로 나눕니다 덩어리 크기2N, 각 비교기를 √로 교체 한 후 AKS 네트워크를 사용하여 청크를 정렬하십시오.N/2 소터. N
Jeffε

1
@ Jɛ ff E : 그렇습니다. 제 건축보다 훨씬 간단합니다.
Vinayak Pathak

1
@ Jɛ ff E, 귀하의 의견은 답변이 될 수 있습니다. :)
Kaveh

답변:


15

O 로 정렬 할 수 있습니다 ( 블랙 박스를 호출하고 비교하지 않습니다.O(nlogn)

먼저, 다음과 같은 균형 분할 문제를 고려하십시오 : 주어진 요소 A [ 1 .. m ] (여기서 mA[1..m]) 인 경우, 최소 약m/4크기의 가장 작은 두 그룹으로 분할하여 첫 번째 그룹의 모든 요소가 두 번째 그룹의 모든 요소보다 작습니다. 이것은O(m/nmnm/4블랙 박스를 호출합니다. (나중에 설명하겠습니다.) 그런 다음이 분할 알고리즘과 함께 퀵 정렬을 사용하십시오.O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

각 파티션 단계가 입력A[1 ..n]가주어지면 위 알고리즘에서 블랙 박스를 호출하면O(O(m/n)A[1..n]재귀 트리의 깊이는O(logn)이고 트리의 각 레벨의 합계는O(n/ )이므로 n logn)은 블랙 박스를 호출합니다.O(nlogn)O(logn)블랙 박스를 호출합니다.O(n/n)=O(n)

다음과 같이 파티션 단계를 수행하십시오.

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

알고리즘 partition ()의 마지막 단계에서 : "X 주위에 모든 m 개의 요소를 분할하십시오", 이것은 추가 비교를 사용하지 않습니까?
Vinayak Pathak

2
알고리즘 바로 뒤에 나오는 행을 참조하십시오. 해당 단계를 수행하는 방법이 설명되어 있습니다. 더 명확하게하기 위해 편집하겠습니다.
닐 영

24

당신의 질문은 1990 년부터 Beigel과 Gill의 논문 " k-sorter를 사용하여 n 개의 객체 정렬하기 "에서 다루어졌고 논문 의 초록은 다음과 같이 말합니다 :

k- 소터는 k 개의 개체를 단위 시간으로 정렬하는 장치입니다. k 소터를 사용하는 알고리즘의 복잡성은 k 소터의 적용 횟수로 정의된다. 이 측정에서 n 개체 정렬의 복잡성은 n log n 사이입니다.4N로그Nnlognklogk , n 및 k의 1 차 항까지.4nlognklogk


고맙습니다. 나는 종이를 찾을 수 없었다. 종이 또는 그 증거에 대한 링크를 제공 할 수 있습니까?
AmeerJ


또한에 citeseerx .
Kaveh

8
참고 때 , Beigel 및 Gill의 경계는Θ(k=nΘ(n)

12

O(nlogn)n

다음은 단순한 알고리즘의 스케치입니다. 블랙 박스를 사용하여 크기가 하위 배열을 정렬합니다.kn2(n/k)2k2n/k

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

n=18k=4k

여기에 이미지 설명을 입력하십시오

k/2k

O((n/k)2)O((n/k)log2(n/k))=O(nlog2n)O((n/k)log(n/k))=O(nlogn)


Ω(n lg(n))

2
O(n)

멋진 사진을 위해 +1! 나는 잘못 생각할 수도 있지만 그것이 완전히 정확하지 않은 것 같습니다 (잘못되면 정정하십시오). 출력이 오름차순으로 가정하면 가장 작은 요소가 마지막 위치에 있으면 첫 번째 위치로 "이동"할 수있는 "경로"가 없습니다. "i = 1에서 m으로"에서 "i = 1에서 m + 1으로"를 변경하면 불필요한 오버 헤드가 발생할 수 있지만이를 수정하는 것 같습니다.
George

@George Oops, 당신 말이 맞아요. 레이어가 하나 더 필요합니다!
Jeffε
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.