TL: DR; Kode Anda sudah benar dan "bersih".
Saya melihat banyak orang bertanya-tanya tetapi semua orang kehilangan hutan melalui pepohonan. Mari kita lakukan ilmu komputer penuh dan analisis matematika untuk sepenuhnya memahami pertanyaan ini.
Pertama, kita perhatikan bahwa kita memiliki 3 variabel, masing-masing dengan 3 menyatakan: <, =, atau>. Jumlah total permutasi adalah 3 ^ 3 = 27 status, yang akan saya berikan nomor unik, dilambangkan dengan P #, untuk setiap status. Nomor P # ini adalah sistem angka faktorial .
Merinci semua permutasi yang kita miliki:
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
Dengan inspeksi kami melihat kami memiliki:
- 3 menyatakan di mana A adalah maks,
- 3 menyatakan di mana B adalah maks,
- 3 menyatakan di mana C adalah maks, dan
- 4 menyatakan di mana A = B, atau B = C.
Mari kita menulis sebuah program (lihat catatan kaki) untuk menghitung semua permutasi ini dengan nilai untuk A, B, dan C. Penyortiran yang stabil dengan 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
Jika Anda bertanya-tanya bagaimana saya tahu negara bagian mana yang tidak mungkin, sekarang Anda tahu. :-)
Jumlah perbandingan minimum untuk menentukan pesanan adalah:
Log2 (27) = Log (27) / Log (2) = ~ 4,75 = 5 perbandingan
yaitu coredump memberikan 5 perbandingan jumlah minimal yang benar. Saya akan memformat kodenya sebagai:
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 ;
}
}
Untuk masalah Anda, kami tidak peduli tentang pengujian untuk kesetaraan sehingga kami dapat menghilangkan 2 tes.
Tidak masalah seberapa bersih / buruk kodenya jika mendapat jawaban yang salah jadi ini pertanda baik bahwa Anda menangani semua kasing dengan benar!
Selanjutnya, untuk kesederhanaan, orang-orang terus berusaha untuk "meningkatkan" jawabannya, di mana mereka berpikir meningkatkan berarti "mengoptimalkan" jumlah perbandingan, tetapi itu tidak sepenuhnya apa yang Anda minta. Anda bingung semua orang di mana Anda bertanya "Saya merasa mungkin ada yang lebih baik" tetapi tidak mendefinisikan apa artinya 'lebih baik'. Lebih sedikit perbandingan? Kode kurang? Perbandingan yang optimal?
Sekarang karena Anda bertanya tentang keterbacaan kode (diberikan kebenaran) saya hanya akan membuat satu perubahan pada kode Anda untuk keterbacaan: Sejajarkan tes pertama dengan yang lain.
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
Secara pribadi saya akan menulisnya dengan cara berikut tetapi ini mungkin terlalu tidak lazim untuk standar pengkodean Anda:
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
Catatan Kaki: Berikut ini adalah kode C ++ untuk menghasilkan permutasi:
#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;
}
Suntingan: Berdasarkan umpan balik, memindahkan TL: DR ke atas, menghapus tabel yang tidak disortir, mengklarifikasi 27, membersihkan kode, menggambarkan keadaan yang mustahil.