2016-05-06 8 views
0

Wenn Sie die Eingaben 9999999999999999999 100000 für den folgenden Code versuchen, wird die Logik etwa 5 Sekunden lang ausgeführt. Ich habe nach dem Flaschenhals gesucht und herausgefunden, dass es die mod() Methode ist. Gibt es einen besseren Kompromiss für große Zahlen?BigInteger-Methode mod() Leistung ist schlecht. Gibt es einen besseren Kompromiss für große Zahlen?

+0

http://stackoverflow.com/a/33223058/829571 – assylias

+1

'mod' könnte der teuerste Teil Ihres Codes sein, aber das bedeutet nicht, dass er tatsächlich weiter optimiert werden kann. Es ist schwer zu sagen, von Ihrem Code, aber ehrlich gesagt sieht es sehr ähnlich aus wie die Mathematik, die Sie versuchen, ist einfach nur teuer. –

+0

Siehe auch http://stackoverflow.com/questions/8287144/modulus-power-of-big-numbers – assylias

Antwort

0

Anstatt eine große Zahl zu speichern, speichern Sie diese Nummer mod mBI, und Ihre Mod-Operation wird nicht so lange dauern. Wenn Sie

ersetzen
result = second.add(first); 

mit

result = second.add(first).mod(mBI); 

und Ihre Bedingung machen table.add(result) statt table.add (result.mod(mBI)), erhalten Sie eine deutlich bessere Leistung.

+0

danke @ user2791611, aber ich muss das Ergebnis von second.add (erste) für die nächste Schleife halten. – juliocnsouza

+0

@juliocnsozuza Von dem was ich sehen kann, brauchst du das Ergebnis nicht wirklich, du brauchst das Ergebnis mod mBI. Sie verwenden immer nur das Ergebnis mod mBI. Ich habe diesen Code an den zwei Eingängen getestet, die Sie in der Frage angegeben haben, und er liefert das gleiche Ergebnis in viel kürzerer Zeit. Gibt es etwas, das mir fehlt? – amiller27

+0

danke @ user2791611 du hast recht, es hat viel schneller geklappt! Ich weiß wirklich nicht, was ich im ersten Test gemacht habe, der mich dazu gebracht hat, mit der oben erwähnten Schlussfolgerung zu kommen. Danke für die Antwort und um meine Aufmerksamkeit darauf zu lenken: D. – juliocnsouza