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


19

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

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

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


"비교"트리를 작성해 보셨습니까? 그것은 잎, 각각 정수의 순열에 해당합니다. "비교 대상"트리의 의미를 모르는 경우 n log n 비교 가 필요하다는 증거를 알고 있습니까? PS, 무엇이 가능하다고 생각합니까? 5!=120nlog⁡n
— 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 . 그래서 입니다 (원칙적으로) 가능합니다. 2c≥n!5!=120<27=128
— vonbrand

답변:


23

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

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

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

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

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


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

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