Таким образом, одним из возможных решений этой проблемы является использование динамического c программирования и сохранение данных в массиве вместо использования карты.
Я пошел дальше и попытался воссоздать ваш код, используя этот подход (вы сказали 2k! В вашем вопросе, но в вашем коде этого не было, поэтому я реализовал это), и я получил примерно 25% улучшение скорости для большего k. Главный недостаток использования этого подхода заключается в том, что вам необходимо заранее определить размер массива.
Код:
public static BigInteger fact(int k, BigInteger[] arr) {
if (k > 0) {
arr[0] = BigInteger.valueOf(1);
k *= 2;
for (int i = 1; i <= k; ++i) {
arr[i] = BigInteger.valueOf(i).multiply(arr[i - 1]);
}
} else {
System.out.println("A negative k was entered.");
return null;
}
return arr[k];
}
Использование этого подхода со значением k, равным 2500 (5000 с вашим кодом) и вычисляя время выполнения с использованием nanoTime()
с использованием моего подхода, у меня есть время для вычисления 20787300, тогда как с вашим кодом у меня есть время для вычисления 27325500.
Вы можете узнать больше о Dynami c программирование здесь .