Als zusätzliche Frage zu einer Aufgabe wurden wir gebeten, die 10 Startnummern (n) zu finden, die die längste collatz-Sequenz erzeugen. (Wo 0 < n < 10.000.000.000) Ich schrieb Code, der dies hoffentlich erreichen würde, aber ich schätze, dass es volle 11 Stunden dauern würde, um eine Antwort zu berechnen.colatz sequenz - Optimierungscode
Ich habe ein paar kleine Optimierungen bemerkt, angefangen vom größten bis zum kleinsten, so dass das Hinzufügen zu dem Array weniger ist und nur zwischen 10.000.000.000/2^10 (= 9765625) und 10.000.000.000 berechnet wird, weil es 10 Folgen von längere Länge, aber ich kann nichts mehr sehen, was ich tun könnte. Kann jemand helfen?
Relevante-Code Die Sequenz Alg Suche
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
}
}
Die Speicher 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;
}
Eine Mikrooptimierung würde "/ 2" durch ">>> 1" ersetzen. Aber das würde nicht viel tun. –
Ich bin nicht der große Held hier, aber Wikipedia hat einen schönen Abschnitt darüber. Sie können einige Vorberechnungen durchführen, mit denen Sie 'k'-Iterationen gleichzeitig durchführen können. https://en.wikipedia.org/wiki/Collatz_conjecture#Optimizations –
Ich lerne nur über die weniger gebräuchlichen (aka nicht arimethischen) Operatoren, so ist es interessant und wahrscheinlich nützlich zu wissen, aber der Wiki-Artikel ist weit jenseits meiner aktuellen Umfang der Programmierung. Ich werde definitiv versuchen und es zu erforschen, obwohl – spyr03