Come domanda aggiuntiva a un compito, ci è stato chiesto di trovare i 10 numeri iniziali (n) che producono la sequenza collatz più lunga. (Dove 0 < n. < 10.000.000.000) Ho scritto codice che, si spera, sarebbe stato utile, ma ho stimato che ci sarebbero volute ben 11 ore per calcolare una risposta.sequenza collatz - codice di ottimizzazione
Ho notato un paio di piccole ottimizzazioni come partire dal più grande al più piccolo, quindi l'aggiunta all'array viene eseguita meno e solo il calcolo tra 10.000.000.000/2^10 (= 9765625) e 10.000.000.000 perché ci devono essere 10 sequenze di più lunga, ma non riesco a vedere altro che potrei fare. Qualcuno può aiutare?
relativo codice La Sequenza Ricerca Alg
long[][] longest = new long[2][10]; //terms/starting number
long max = 10000000000l; //10 billion
for(long i = max; i >= 9765625; i--) {
long n = i;
long count = 1; //terms in the sequence
while(n > 1) {
if((n & 1) == 0) n /= 2; //checks if the last bit is a 0
else {
n = (3*n + 1)/2;
count++;
}
count++;
}
if(count > longest[0][9]) {
longest = addToArray(count, i, longest);
currentBest(longest); //prints the currently stored top 10
}
}
Lo stoccaggio ALG
public static long[][] addToArray(long count, long i, long[][] longest) {
int pos = 0;
while(count < longest[0][pos]) {
pos++;
}
long TEMP = count; //terms
long TEMPb = i; //starting number
for(int a = pos; a < longest[0].length; a++) {
long TEMP2 = longest[0][a];
longest[0][a] = TEMP;
TEMP = TEMP2;
long TEMP2b = longest[1][a];
longest[1][a] = TEMPb;
TEMPb = TEMP2b;
}
return longest;
}
Una micro ottimizzazione sostituisce '/ 2' di' >>> 1'. Ma questo non farebbe molto. –
Qui non sono il grande eroe, ma Wikipedia ha una bella sezione a riguardo. Puoi fare alcune pre-computazioni che ti permettono di effettuare iterazioni di 'k' in una volta. https://en.wikipedia.org/wiki/Collatz_conjecture#Optimizations –
Sto solo imparando gli operatori meno comuni (cioè non arimetici), quindi è interessante e probabilmente utile sapere, ma l'articolo wiki è ben oltre la mia attuale ambito di programmazione. Cercherò sicuramente di cercarlo anche se – spyr03