TL : DR; 귀하의 코드는 이미 정확하고 "깨끗합니다".
나는 많은 사람들이 답을 엉망으로 만드는 것을 보았지만 모든 사람들이 나무를 통해 숲을 잃어 버렸습니다. 이 질문을 완전히 이해하기 위해 전체 컴퓨터 과학 및 수학 분석을 해 봅시다.
먼저, 각각 3 개의 상태를 갖는 3 개의 변수가 있습니다 : <, = 또는>. 총 순열 수는 3 ^ 3 = 27 개 상태이며 각 상태에 대해 P #으로 표시되는 고유 번호를 지정합니다. 이 P # 번호는 계승 시스템 입니다.
우리가 가진 모든 순열을 열거 :
a ? b | a ? c | b ? c |P#| State
------+-------+-------+--+------------
a < b | a < c | b < c | 0| C
a = b | a < c | b < c | 1| C
a > b | a < c | b < c | 2| C
a < b | a = c | b < c | 3| impossible a<b b<a
a = b | a = c | b < c | 4| impossible a<a
a > b | a = c | b < c | 5| A=C > B
a < b | a > c | b < c | 6| impossible a<c a>c
a = b | a > c | b < c | 7| impossible a<c a>c
a > b | a > c | b < c | 8| A
a < b | a < c | b = c | 9| B=C > A
a = b | a < c | b = c |10| impossible a<a
a > b | a < c | b = c |11| impossible a<c a>c
a < b | a = c | b = c |12| impossible a<a
a = b | a = c | b = c |13| A=B=C
a > b | a = c | b = c |14| impossible a>a
a < b | a > c | b = c |15| impossible a<c a>c
a = b | a > c | b = c |16| impossible a>a
a > b | a > c | b = c |17| A
a < b | a < c | b > c |18| B
a = b | a < c | b > c |19| impossible b<c b>c
a > b | a < c | b > c |20| impossible a<c a>c
a < b | a = c | b > c |21| B
a = b | a = c | b > c |22| impossible a>a
a > b | a = c | b > c |23| impossible c>b b>c
a < b | a > c | b > c |24| B
a = b | a > c | b > c |25| A=B > C
a > b | a > c | b > c |26| A
검사를 통해 우리는 다음을 볼 수 있습니다.
- A가 최대 인 3 가지 상태
- B가 최대 인 3 가지 상태,
- C가 최대 인 3 가지 상태
- 4는 A = B 또는 B = C 인 상태입니다.
이 모든 순열을 A, B 및 C에 대한 값으로 열거하는 프로그램 (각주 참조)을 작성해 봅시다. P #을 기준으로 안정적인 정렬 :
a ?? b | a ?? c | b ?? c |P#| State
1 < 2 | 1 < 3 | 2 < 3 | 0| C
1 == 1 | 1 < 2 | 1 < 2 | 1| C
1 == 1 | 1 < 3 | 1 < 3 | 1| C
2 == 2 | 2 < 3 | 2 < 3 | 1| C
2 > 1 | 2 < 3 | 1 < 3 | 2| C
2 > 1 | 2 == 2 | 1 < 2 | 5| ??
3 > 1 | 3 == 3 | 1 < 3 | 5| ??
3 > 2 | 3 == 3 | 2 < 3 | 5| ??
3 > 1 | 3 > 2 | 1 < 2 | 8| A
1 < 2 | 1 < 2 | 2 == 2 | 9| ??
1 < 3 | 1 < 3 | 3 == 3 | 9| ??
2 < 3 | 2 < 3 | 3 == 3 | 9| ??
1 == 1 | 1 == 1 | 1 == 1 |13| ??
2 == 2 | 2 == 2 | 2 == 2 |13| ??
3 == 3 | 3 == 3 | 3 == 3 |13| ??
2 > 1 | 2 > 1 | 1 == 1 |17| A
3 > 1 | 3 > 1 | 1 == 1 |17| A
3 > 2 | 3 > 2 | 2 == 2 |17| A
1 < 3 | 1 < 2 | 3 > 2 |18| B
1 < 2 | 1 == 1 | 2 > 1 |21| B
1 < 3 | 1 == 1 | 3 > 1 |21| B
2 < 3 | 2 == 2 | 3 > 2 |21| B
2 < 3 | 2 > 1 | 3 > 1 |24| B
2 == 2 | 2 > 1 | 2 > 1 |25| ??
3 == 3 | 3 > 1 | 3 > 1 |25| ??
3 == 3 | 3 > 2 | 3 > 2 |25| ??
3 > 2 | 3 > 1 | 2 > 1 |26| A
불가능한 P # 상태를 어떻게 알았는지 궁금한 경우 이제 알 것입니다. :-)
순서를 결정하기위한 최소 비교 수는 다음과 같습니다.
Log2 (27) = Log (27) / Log (2) = ~ 4.75 = 5 비교
즉, 코어 덤프는 정확한 5 개의 최소 비교 횟수를 제공했습니다. 그의 코드를 다음과 같이 포맷합니다.
status_t index_of_max_3(a,b,c)
{
if (a > b) {
if (a == c) return DONT_KNOW; // max a or c
if (a > c) return MOSTLY_A ;
else return MOSTLY_C ;
} else {
if (a == b) return DONT_KNOW; // max a or b
if (b > c) return MOSTLY_B ;
else return MOSTLY_C ;
}
}
귀하의 문제에 대해 우리는 동등성 테스트에 신경 쓰지 않으므로 2 가지 테스트를 생략 할 수 있습니다.
코드가 잘못 대답하면 코드가 얼마나 깨끗하고 나쁜지 중요하지 않으므로 모든 경우를 올바르게 처리하고 있다는 좋은 신호입니다!
다음으로, 단순성에 관해서, 사람들은 답을 "개선"하려고 노력합니다. 개선이 비교의 수를 "최적화"하는 것을 의미한다고 생각하지만, 그것이 당신이 요구하는 것은 아닙니다. 당신은 당신이 "나는 더 나을지도 모른다고 생각한다"고 물었지만 더 나은 것이 무엇을 의미하는지 정의하지 않은 모든 사람들을 혼란스럽게했다. 더 적은 비교? 코드가 적습니까? 최적의 비교?
코드 가독성 (정확성) 에 대해 묻고 있으므로 가독성 을 위해 코드를 한 번만 변경하려고합니다. 첫 번째 테스트를 다른 테스트와 정렬하십시오.
if (a > b && a > c)
status = MOSTLY_A;
else if (b > a && b > c)
status = MOSTLY_B;
else if (c > a && c > b)
status = MOSTLY_C;
else
status = DONT_KNOW; // a=b or b=c, we don't care
개인적으로 다음과 같이 작성하지만 코딩 표준에 비해 너무 정통하지 않을 수 있습니다.
if (a > b && a > c) status = MOSTLY_A ;
else if (b > a && b > c) status = MOSTLY_B ;
else if (c > a && c > b) status = MOSTLY_C ;
else /* a==b || b ==c*/status = DONT_KNOW; // a=b or b=c, we don't care
각주 : 순열을 생성하는 C ++ 코드는 다음과 같습니다.
#include <stdio.h>
char txt[] = "< == > ";
enum cmp { LESS, EQUAL, GREATER };
int val[3] = { 1, 2, 3 };
enum state { DONT_KNOW, MOSTLY_A, MOSTLY_B, MOSTLY_C };
char descr[]= "??A B C ";
cmp Compare( int x, int y ) {
if( x < y ) return LESS;
if( x > y ) return GREATER;
/* x==y */ return EQUAL;
}
int main() {
int i, j, k;
int a, b, c;
printf( "a ?? b | a ?? c | b ?? c |P#| State\n" );
for( i = 0; i < 3; i++ ) {
a = val[ i ];
for( j = 0; j < 3; j++ ) {
b = val[ j ];
for( k = 0; k < 3; k++ ) {
c = val[ k ];
int cmpAB = Compare( a, b );
int cmpAC = Compare( a, c );
int cmpBC = Compare( b, c );
int n = (cmpBC * 9) + (cmpAC * 3) + cmpAB; // Reconstruct unique P#
printf( "%d %c%c %d | %d %c%c %d | %d %c%c %d |%2d| "
, a, txt[cmpAB*2+0], txt[cmpAB*2+1], b
, a, txt[cmpAC*2+0], txt[cmpAC*2+1], c
, b, txt[cmpBC*2+0], txt[cmpBC*2+1], c
, n
);
int status;
if (a > b && a > c) status = MOSTLY_A;
else if (b > a && b > c) status = MOSTLY_B;
else if (c > a && c > b) status = MOSTLY_C;
else /* a ==b || b== c*/status = DONT_KNOW; // a=b, or b=c
printf( "%c%c\n", descr[status*2+0], descr[status*2+1] );
}
}
}
return 0;
}
편집 : 피드백에 따라 TL : DR을 맨 위로 이동하고 정렬되지 않은 테이블을 제거하고 명확하게 정리하고 코드를 정리하고 불가능한 상태를 설명했습니다.