비교 정렬

Comparison sort
균형 척도만 사용하여 가중치별로 레이블이 지정되지 않은 가중치 집합을 정렬하려면 비교 정렬 알고리즘이 필요합니다.

비교 정렬은 최종 정렬 목록에서 두 가지 요소 중 가장 먼저 발생해야 하는 요소를 결정하는 단일 추상 비교 연산자(종종 "이하" 연산자 또는 3방향 비교)를 통해서만 목록 요소를 읽는 정렬 알고리즘의 한 유형입니다.유일한 요구 사항은 연산자가 데이터에 대해 다음과 같은 총 사전 주문을 형성해야 한다는 것입니다.

  1. a b b bc일 경우 a c c (비활성)
  2. 모든 a와 b에 대해 a'b 또는 b'a(connexity).

a 'b'와 b 'a' 둘 일 수 있습니다.이 경우 정렬된 목록에서 어느 한쪽이 첫 번째가 될 수 있습니다.안정적인 정렬에서는 입력 순서에 따라 정렬된 순서가 결정됩니다.

비교 분류에 대해 생각하는 비유는 라벨이 없는 무게와 균형 척도를 가진 사람이 있다는 것입니다.그들의 목표는 저울에 두 개의 무게를 두고 어느 것이 더 무거운지(또는 같은 무게인지)를 보고 얻은 것을 제외하고 아무런 정보 없이 무게에 따라 순서대로 무게를 정렬하는 것이다.

번호 목록에서 빠르게 정렬합니다.수평선은 피벗 값입니다.

가장 잘 알려진 비교 정렬에는 다음이 포함됩니다.

다양한 정렬 기술의 성능 제한 및 이점

비교 종류의 성능에는 근본적인 제한이 있습니다.비교 정렬에는 평균 대소문자 하한을 δ(n log n) 비교 연산([1]선형 광시)으로 해야 합니다.이는 비교를 통해서만 이용할 수 있는 제한된 정보 또는 달리 말하면, 완전히 순서가 매겨진 집합의 애매한 대수 구조의 결과이다.이러한 의미에서 mergesort, humpsort 및 introsort는 다른 연산을 무시하지만 수행해야 하는 비교의 수 면에서 점근적으로 최적입니다.비교 이외의 정렬(아래에서 설명하는 예 등)은 비교 이외의 연산을 사용하여 O(n) 성능을 얻을 수 있으며, 이 하한을 회피할 수 있습니다(요소의 크기가 일정하다고 가정).

일부 목록에서는 비교 정렬이 더 빠르게 실행될 수 있습니다. 삽입 정렬과 같은 많은 적응 정렬이 이미 정렬되었거나 거의 정렬된 목록에서 O(n) 시간 내에 실행됩니다.δ(n log n) 하한이 적용되는 것은 입력 리스트가 임의의 순서로 되어 있는 경우 뿐입니다.

실제 정렬 속도 측정에서는 일부 알고리즘이 비교적 빠른 캐시된 컴퓨터 메모리를 최적으로 사용할 수 있는지 고려해야 합니다.또는 정렬된 데이터가 사용자에게 빠르게 표시되기 시작하는 정렬 방법(그 후 사용자의 읽기 속도가 제한 요소가 됩니다)을 통해 응용 프로그램이 이점을 얻을 수 있습니다.전체 목록이 정렬될 때까지 출력을 사용할 수 없습니다.

이러한 제한에도 불구하고, 비교 정렬은 비교 함수를 제어하는 것이 많은 다른 데이터 유형을 정렬하고 목록이 정렬되는 방법을 미세하게 제어할 수 있다는 주목할 만한 실용적인 이점을 제공합니다.예를 들어 비교함수의 결과를 반전시키면 목록을 역순으로 정렬할 수 있습니다.또한 각 부품을 순서대로 비교하는 비교함수만 만들면 사전순으로 튜플 목록을 정렬할 수 있습니다.

함수 tupleCompare((왼쪽, 왼쪽 b, 왼쪽 c), (오른쪽, 오른쪽 b, 오른쪽 c) 왼쪽 b right 오른쪽 a return compare(왼쪽 b, 오른쪽 c) 왼쪽 b right 오른쪽 b return compare(왼쪽 b, 오른쪽 c) 왼쪽 b return 오른쪽 ceturn compare(왼쪽 c, 오른쪽 c) 왼쪽 c)

균형 3진 표기를 사용하면 한 번에 비교할 수 있으며, 그 결과는 "보다 작음", "보다 큼", 또는 "같음" 중 하나가 됩니다.

비교 정렬은 일반적으로 부동 소수점 숫자의 순서와 같은 복잡한 순서에 더 쉽게 적응합니다.또한 비교 함수가 작성되면 모든 비교 정렬을 수정 없이 사용할 수 있습니다.비교 정렬이 아닌 경우에는 일반적으로 각 데이터 유형에 대해 특수 버전이 필요합니다.

이러한 유연성은 최신 컴퓨터에서의 위의 비교 정렬 알고리즘의 효율성과 함께 대부분의 실제 작업에서 비교 정렬을 광범위하게 선호하게 되었습니다.

대체 수단

일부 정렬 문제에서는 비교 정렬에 사용되는 δ(n log n)보다 훨씬 빠른 솔루션을 사용할 수 있습니다.예를 들어, 모든 키가 정수인 정수 정렬이 있습니다.키가 작은 범위(n에 비해)를 형성하는 경우 카운트 정렬은 선형 시간으로 실행되는 알고리즘의 예입니다.기수 정렬과 같은 다른 정수 정렬 알고리즘은 비교 정렬보다 점근적으로 빠르지 않지만 실제로는 더 빠를 수 있습니다.

숫자의 쌍을 합계로 정렬하는 문제δ(n² log n) 바인딩(쌍으로 이루어진 제곱)의 영향을 받지 않습니다. 가장 잘 알려진 알고리즘은 여전히 O(n² log n) 시간이 걸리지만 O() 비교만 가능합니다.

목록 정렬에 필요한 비교 수

n 최소값
1 0 0
2 1 1
3 3 3
4 5 5
5 7 7
6 10 10
7 13 13
8 16 16
9 19 19
10 22 22
11 26 26
12 29 30개[2][3]
13 33 34[4][5][6]
14 37 38[6]
15 41 42[7][8][9]
16 45 45 또는 46[10]
17 49 49 또는 50
18 53 53 또는 54
19 57 58[9]
20 62 62
21 66 66
22 70 71[6]
n
10 22 19
100 525 521
1 000 8 530 8 524
10 000 118 459 118 451
100 000 1 516 705 1 516 695
1 000 000 18 488 885 18 488 874
상기: (최악의 경우) n개의 항목 목록을 정렬하기 위해 필요한 실제 최소 비교 수와의 하한 2 (! ) \ \_ { ( ! ) \ \ 비교.아래: 스털링의 근사치를 사용하여 이 하한을 2 - n 2 { n \ _ { }- { \ { n }{ \ 2로 근사합니다.

비교 정렬 알고리즘에 한 비교 횟수는 log () { n \ ( )n { n}은 정렬할 요소의 수입니다.이 경계는 점근적으로 좁다.

고유 번호 목록(최악의 경우 분석이므로 추정할 수 있음)을 지정하면n개의 {\ n 요인 배열이 , 그 중 정확히 1개는 정렬된 순서대로 나열되어 있습니다.정렬 알고리즘은 올바른 순열을 식별하기 위해 비교에서 충분한 정보를 얻어야 합니다.알고리즘이 f( )\ f ( ), at after after the,, () }을 넘는 경우는 구별되지 않습니다.이는 키가 구별되고 각 비교의 결과는 2개뿐이기 때문입니다.그러므로,

f ( ) 2n 또는 f () 2 !。{ )\ \}(

! ( -) 1 \ nn ( )\1의 첫 n/{ n/ 계수를 보면 다음과 같이 됩니다.

이것은 클레임의 하한 부분을 제공합니다.스털링의 근사치를 통해 더 나은 바운드를 얻을 수 있습니다.

힙소트머지소트와 같이 최악의 경우 이 경계에 도달하는 알고리즘의 존재에 따라 동일한 상한이 발생합니다.

위의 인수는 비교 횟수의 점근 하한뿐만 아니라 절대 하한 즉 " 2 (" (\ _ ( 비교입니다.이 하한은 상당히 양호하지만(단순 병합 정렬을 통해 선형 공차 내에서 접근할 수 있음) 정확하지 않은 것으로 알려져 있습니다.를 들어" 2"( { left \ \ _ {2 ( ! ) \ \ =} 입니다만, 13 요소를 정렬하기 위한 최소 비교 횟수는 34회입니다.

소정의 수의 엔트리를 정렬하는 데 필요한 정확한 비교 수를 결정하는 것은 작은 n개의 경우에도 계산하기 어려운 문제이며, 솔루션의 간단한 공식은 알려져 있지 않습니다.계산된 몇 가지 구체적인 값은 OEIS: A036604를 참조하십시오.

평균 비교 횟수에 대한 하한

비슷한 경계가 평균 비교 횟수에 적용된다.라고 가정하면

  • 모든 키는 구별됩니다.즉, 모든 비교는 a>b 또는 <b하나를 나타냅니다.
  • 입력은 n개 요소의 가능한 모든 순열 집합에서 균일하게 선택되는 무작위 순열이다.

평균 log(n!)보다2 적은 비교로 입력 순서를 판별할 수 없습니다.

이것은 정보 이론의 개념을 사용하면 가장 쉽게 볼 수 있다.이러한 랜덤 치환의 섀넌 엔트로피는 log(n!) 비트입니다2.비교는 2개의 결과밖에 얻을 수 없기 때문에 최대 정보량은 1비트입니다.따라서 k 비교 후 비교 결과에 따라 치환의 나머지 엔트로피는 평균2 log(n!) - k비트입니다.정렬을 수행하려면 완전한 정보가 필요하므로 나머지 엔트로피는 0이어야 합니다.따라서 k는 평균 log(n!) 이상이어야2 합니다.

정보이론을 통해 도출된 하한을 '정보이론 하한'이라고 표현한다.정보 이론 하한이 올바르지만 반드시 가장 강한 하한이 될 필요는 없습니다.그리고 경우에 따라서는 정보 이론상 문제의 하한이 실제 하한과는 거리가 멀 수도 있습니다.예를 들어 정보이론의 선택 하한은 2 ( ) display{ \ \ lceil \ _ {2} ) \ right \ }인데 n- { n -} 비교는 적대적 인수에 의해 필요합니다.정보 이론 하한과 참 하한 간의 상호작용은 정수 함수를 하한으로 하는 실값 함수와 매우 유사합니다.그러나 평균적인 경우를 고려할 때 이는 정확하게 옳지 않다.

평균 사례를 분석하는 동안 어떤 일이 일어나는지 알아내기 위해 핵심은 '평균'이 무엇을 의미합니까?뭘 평균화하는데?정보이론에 대한 약간의 지식을 가지고, 정보이론의 하한은 전체 순열의 집합에 걸쳐 평균이 된다.그러나 컴퓨터 알고리즘은 (현재 생각되는 바에 따라) 각 치환을 문제의 개별 인스턴스로 취급해야 합니다.따라서 우리가 찾는 평균 하한은 모든 개별 사례에 걸쳐 평균이 됩니다.

컴퓨터의 도달 불가능성과 관련된 하한을 검색하기 위해 Decision Tree 모델을 채택합니다.우리의 목표가 무엇인지 조금 바꿔서 말해 봅시다.Decision Tree 모델에서 표시되는 하한은 n n 리프 바이너리 트리(각 잎이 순열에 해당)의 루트-리프 경로 평균 길이의 하한입니다.균형 잡힌 전체 이진 트리가 평균 길이의 최소값을 달성한다고 말할 수 있습니다.n!\ ndisplaystyle n!} 잎을 가진 잡힌 전체 이진 트리의 경우 루트-리프 경로의 평균 길이는 다음과 같습니다.

예를 들어, n = 3경우, 평균 사례에 대한 정보 분석 하한이 약 2.58인 반면, 의사결정 트리 모델을 통해 도출된 평균 하한이 약 2.67인 8/3이다.

여러 항목이 동일한 키를 가질 수 있는 경우, "평균 사례"라는 용어에 대한 명확한 통계적 해석은 없기 때문에, 키의 분배에 대한 구체적인 가정을 하지 않고는 위와 같은 주장을 적용할 수 없다.

n 로그 n 형식 2^k의 어레이 크기 비교 최대 수

실제 알고리즘 sorted-list-merging을 쉽게 계산할 수 있습니다(어레이는 크기가 1인 n개의 블록으로 정렬되고, 1-1에서 2로 병합되며, 2-2에서 4로 병합됨).

(1) ======== (2) = = // 최대 1은 비교(size1+size2-1), 4x 반복은 크기가 1 및 1인 8개 어레이에 적용 ============ // 최대 7은 비교, 2x 반복은 크기가 2 및 2인 4개 어레이에 적용 === ===== ===== ============== ============== (4) 최대 15와 1x 반복크기가 4 및 4인 oncat 2 어레이: n = 256 = 2^8 (간소화를 위해 2^k 형식의 어레이 크기) On = (n-1) + 2 (n/2-1) + 4 (n/8-1) + 16 (n/16-1) + 32 (n/32-1) + 64-1 (n)= 기하학적 배열 Sn = a1 * (q^i - 1) / (n - 1) n은 항목 수이고, a1은 첫 번째 항목 On = 8*n - 1 * (2^8 - 1) On = 8*n - (2^8 - 1) 2^8 = On = 8*n - 1 (n - 1) On = 8*n - 1, On ~= 9*n n = 2^20 = 1.048.576, On ~= 19*n

미리 정렬된 목록 정렬

리스트가 이미 정렬에 가까운 경우 정렬에 필요한 비교의 수는 어느 정도의 척도에 따라서는 작아질 수 있습니다.적응형 정렬은 이러한 "선정성"을 이용하여 거의 정렬된 입력에서 더 빠르게 실행됩니다. 대부분의 경우 O logn O n 경우 시간 제한을 유지합니다.예를 들어 데카르트 트리에 기반한 정렬 알고리즘인 적응정렬이 있습니다.( logk ){ O ( \ k)k { k }는 의 모든 값x { x}에 대한 시퀀스 점프가 x x보다 작은값에서 x {\x}보다 높은 값으로 점프하는 횟수 또는 [11]그 반대입니다.

메모들

  1. ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2009) [1990]. Introduction to Algorithms (3rd ed.). MIT Press and McGraw-Hill. pp. 191–193. ISBN 0-262-03384-4.
  2. ^ Mark Wells, 콤비네이터학 계산 언어 응용 프로그램, 정보처리 65(1965년 IFIP 의회 의사록), 497-498, 1966년.
  3. ^ Mark Wells, Pergamon Press, Oxford, 1971년, Elements of Combinatory Computing.
  4. ^ 카사이 타쿠미, 사와토 슈사쿠, 이와타 시게키, LNCS 792, 260-269, 1994의 13개 항목 분류에는 34개의 비교가 필요합니다.
  5. ^ Marcin Peczarski, 13개 요소를 정렬하려면 34개의 비교가 필요합니다, LNCS 2461, 785–794, 2002.
  6. ^ a b c Marcin Peczarski, 새로운 결과 최소 비교 정렬, Algorithmica 40(2), 133-145, 2004.
  7. ^ Marcin Peczarski, 2006년 바르샤바 대학 박사 논문, 컴퓨터 보조 연구.
  8. ^ Peczarski, Marcin (2007). "The Ford-Johnson algorithm is still unbeaten for less than 47 elements". Inf. Process. Lett. 101 (3): 126–128. doi:10.1016/j.ipl.2006.09.001.
  9. ^ a b Cheng, Weiyi; Liu, Xiaoguang; Wang, Gang; Liu, Jing (October 2007). "最少比较排序问题中S(15)和S(19)的解决" [The results of S(15) and S(19) to minimum-comparison sorting problem]. Journal of Frontiers of Computer Science and Technology (in Chinese). 1 (3): 305–313.
  10. ^ Peczarski, Marcin (3 August 2011). "Towards Optimal Sorting of 16 Elements". Acta Universitatis Sapientiae. 4 (2): 215–224. arXiv:1108.0866. Bibcode:2011arXiv1108.0866P.
  11. ^ 를 클릭합니다Levcopoulos, Christos; Petersson, Ola (1989), "Heapsort - Adapted for Presorted Files", WADS '89: Proceedings of the Workshop on Algorithms and Data Structures, Lecture Notes in Computer Science, vol. 382, London, UK: Springer-Verlag, pp. 499–509, doi:10.1007/3-540-51542-9_41.

레퍼런스