Questa è una domanda di intervista che dovevo rispondere. Beh, in effetti un amico, ma lui mi ha chiesto e non sapevo nemmeno la risposta. Quindi sto chiedendo qui:Trova il numero più piccolo e il secondo più piccolo in un array di 8 numeri con solo 9 confronti
Dato un array di 8 numeri interi, trovare il più piccolo e il secondo più piccolo intero utilizzando solo 9 confronti. Più precisamente nel tempo n+log(n)-2
.
Sono sicuro che come è possibile farlo utilizzando solo 9 confronti. È così vicino che ci sono arrivato. (10) i confronti
public class Comp {
static int[] nums = new int[]{9, 4, 5, 3, 2, 7, 6, 1};
static int compcount = 0;
//int[] is nums[] array
public static int[] twoLeast(int[] a){
int min1 = a[0]; //Prospective lowest number
int min2 = a[1]; //Prospective second lowest number
if(isLessThan(min2, min1)){
min1 = a[1];
min2 = a[0];
}
for(int i=2; i<a.length;i++){
if(isLessThan(a[i], min1)){
min2 = min1;
min1 = a[i];
}else if(isLessThan(a[i], min2)){
min2 = a[i];
}
}
return new int[]{min1, min2};
}
public static boolean isLessThan(int num1, int num2){
compcount++;
return num1 < num2;
}
}
Qui mi hanno una funzione isLessThan()
per tenere traccia del numero di confronti. Ancora, questo fa 10 confronti. Com'è possibile farlo in 9 confronti. O nel tempo n+log(n)-2
?
PS: ho implementato in Java, ma può essere qualsiasi lingua
Ciao, mi piace la tua analogia, tuttavia i numeri mi confondono nella seconda parte "Quindi il secondo migliore sarà a4, a12 o a5678. Come hai ottenuto" a4, a12, a5678 "Scusa se mi sto chiedendo troppo molto – Krimson
È più facile visualizzare come un albero binario. I numeri sono nelle coppie ordinate con un numero che ha (3) come avversario. Se (3) è il migliore, i giochi che ha giocato sono (a3, a4), (a12, a34) e (a1234, a5678). Quindi gli avversari sono a4, a12 e a5678. – user1952500