최대 7 개의 비교로 5 개의 정수로 정렬


19

최악의 경우 7을 비교하도록 5 개의 정수 목록을 정렬하려면 어떻게해야합니까? 나는 얼마나 많은 다른 작업이 수행되는지는 중요하지 않습니다. 정수에 대해 특별한 것을 모른다.

나는 mergesort 접근법을 따르거나 바이너리 검색을 사용하여 mergesort를 결합하여 삽입 위치를 찾는 것과 같이 8 가지로 나눌 수있는 몇 가지 나누기 및 정복 접근법을 시도했지만 8로 끝날 때마다 최악의 경우를 비교합니다 .

지금은 해결책이 아니라 힌트를 찾고 있습니다.


"비교"트리를 작성해 보셨습니까? 그것은 잎, 각각 정수의 순열에 해당합니다. "비교 대상"트리의 의미를 모르는 경우 n log n 비교 가 필요하다는 증거를 알고 있습니까? PS, 무엇이 가능하다고 생각합니까? 5!=120nlogn
Pål GD

1
음, 8 비트 2의 보수에서 비교하기 어려운 if(x > y)것과 동일 if((x - y) & 0x80)합니다. 나는 우리가 객체가 정수이라는 것을 잊지한다 생각하고 우리가 어떤 마법 사용해야합니다 가정 compare(x, y)... 이러한 개체를 비교하는 기능
카롤 Juodelė

2
' 정확하게이 질문을 다루는 컴퓨터 프로그래밍 기술 3 권에서 최적의 정렬에 대한 섹션 5.3을 확인합니까 ? :-)
Steven Stadnicki

3
한계는 실제로 그리고 5 ! = 120 < 2 7 = 128 . 그래서 입니다 (원칙적으로) 가능합니다. 2cn!5!=120<27=128
vonbrand

답변:


23

이 프로세스를 시작하는 방법은 하나뿐입니다 (나중 단계에서 비교할 사항에 대한 거의 모든 결정에는 올바른 방법이 하나만 있습니다). 알아내는 방법은 다음과 같습니다. 먼저 비교를 위해 얻을 수있는 가능한 답변이 있으며 5 ! = 120 개의 다른 순열을 구별해야합니다.27=1285!=120

첫 번째 비교는 쉽습니다. 두 개의 키를 비교해야하며 이에 대해 아무 것도 모르기 때문에 모든 선택이 동일합니다. 그럼 당신이 비교 가정 해 봅시다 와 B를 , 그리고 것을 발견 B . 이제 2 6 = 64 개의 가능한 답변이 남았으며 60 개의 가능한 순열이 남아 있습니다 (반복을 제거했기 때문에).abab26=6460

다음으로 d 를 비교하거나 c 를 첫 번째 비교에서 사용한 키 중 하나와 비교할 수 있습니다 . 우리가 비교하면 CD를 , 그리고 배우 C D를 , 우리는이 32 개 남아있는 답변 30 가능한 순열을. 우리는 비교한다면 한편, C를 함께 , 우리는 발견 C는 , 우리가 가진 40 우리가 제거했기 때문에, 나머지 가능한 순열을 1 / 3 의 가능한 순열 (와 그 C cdccdcd3230caac401/3 ). 가능한 답변은 32 개뿐이므로 운이 없습니다.cab32

이제 우리는 첫 번째와 두 번째 키와 세 번째와 네 번째 키를 비교해야한다는 것을 알고 있습니다. 우리는 c d 라고 가정 할 수 있습니다 . 우리가 비교하면 전자를 이 네 가지 키 중 하나에, 우리는 이전 단계에서 사용 된 것과 같은 인수로, 우리는 제거 할 수있다 (1) / 3 남아있는 순열, 우리는 운입니다. 따라서 두 개의 키 a , b , c , d 를 비교해야합니다 . 대칭을 고려 하여 ac를 비교하거나 ad를 비교 하는 두 가지 선택이 있습니다.abcde1/3a,b,c,dacad. 비슷한 계산 인수는 c를 비교해야 함을 보여줍니다 . 일반성을 잃지 않고 a c 라고 가정 할 수 있으며 이제 a ba c d가 있습니다.acacabacd

힌트를 요청했기 때문에 나머지 인수는 거치지 않습니다. 네 가지 비교가 남아 있습니다. 현명하게 사용하십시오.


c 를 비교 하면 40 개의 순열 만 어떻게 얻을 수 있었습니까? ac
Robert S. Barnes

1
@Robert : a c 가 있다고 가정하십시오 . 그런 다음 a < b < ca < c < b 와 같은 제약 조건과 일치 하는 a , b , c 의 두 순열이 있습니다. 이 두 순열 각각에 대해 d 를 추가 할 수있는 4 개의 장소 와 e 를 추가 할 수있는 5 개의 장소가 있습니다 . abaca,b,ca<b<ca<c<bde
Peter Shor

8

D.Knuth의 The Art of Computer Programming vol III에서 이것을 찾을 수 있지만 전략은 다음과 같습니다 (나는 배열 가 있다고 가정합니다 ) : 힌트를 읽으려면 내 대답의 처음 두 줄{a,b,c,d,e}

  • 숫자의 첫 번째 그룹 쌍 : .(a,b),(c,d)
  • 쌍을 비교하여 정렬하십시오 (예 : .a<b,c<d
  • 가장 작은 쌍의 요소를 비교하면 결과 입니다.a<c
  • 마지막 요소 를 마지막 비교에서 더 큰 요소 ( c ) 와 비교ec
    • 경우 , 3 남아 비교와 끝까지 쉽습니다. 끝마친.e<c
    • 만약 다음해야 종류 { B , C , D , E } 지식과 C < E , C < D . e>c{b,c,d,e}c<e,c<d
      • , d < e 이면 Compare(d,e)d<e
        • b > d 인 경우 C o m p a r e ( b , d )Compare(b,d)b>d
          • . 끝마친.Compare(b,e)
        • 만약 b<d
          • . 끝마친.Compare(b,c)
      • 만약 d>e
        • b > e 인 경우 C o m p a r e ( b , e )Compare(b,e)b>e
          • Compare(b,d)
        • b<e
          • Compare(b,c)

ec


이것이 맞습니까? a <b, c <d, a <c 및 c <e, b <e, c <b 및 d <e의 결과가 있다고 가정하십시오. 순서 a <c <b <d <e 및 a <c <d <b <e는 모두 일치합니다. 그 이유는 b와 d가 암시 적으로나 명시 적으로 비교되지 않기 때문입니다. 어쩌면 내가 어딘가에 착각했을 수도 있습니다.
조지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.