java – 对于真正大于整数最大值的巨大数,求解递归关系的最佳方法应该是什么
作者:互联网
我想找到递归方程的第N个数
T(n)=T(n-1)+3T(n-2)+3T(n-3)+(n-4),T(1)=T(4)=1,T(2)=T(3)=3
所以如果你输入2,5,9为输入,输出应为T(2)= 3,T(5)= 20,T(9)= 695
我所做的是创建一个大小等于所有输入值的最大值的数组,并在索引i处存储T(i)的解.然后查找数组中的特定索引.例如,T [3]的数组[3],T(5)的数组[5]等
代码工作正常,直到最大数量不大于系统可以容纳的最大整数值,即
Integer.MAXValue.
因为数组的索引只能是整数
如果数字是n = 1855656959555656应该是找到解决方案的最佳方法
T(1855656959555656)?
显然我不能创建一个大小= 1855656959555656的数组..
我甚至尝试过java.Math中的BigInteger但没有成功.
我必须找到一些其他的方法.请提出一些想法..
谢谢
解决方法:
你不需要存储每个T(i),你只需要存储3个值T(i-1),T(i-2),T(i-3).在循环i时,检查当前i是否应该是输出的一部分,如果是,请立即将其输出或将其保存到“输出”-array.
编辑:这部分效率很低.您需要每次迭代检查所需的输出.
for (int k = 0; k < arr.length; ++k) {
if (count == arr[k])
T[k] = temp[i];
else if (arr[k] == 1)
T[k] = 1;
else if (arr[k] == 2)
T[k] = 3;
else if (arr[k] == 3)
T[k] = 3;
else if (arr[k] == 4)
T[k] = 1;
}
所以你的代码及时运行(max * arr.length)你可以把它减少到只有(最大).在arr中使用带有key = neededPosition(= count)value = position的HashMap
像这样初始化地图:
Map<Long, Integer> map = new HashMap<Long, Integer>();
for (int i = 0; i < arr.length; i++) {
map.put(arr[i], i);
}
if (map.containsKey(count)) {
T[map.get(count)] = temp[i]
}
在整个事情之后只检查一次值1-4!
标签:java,arrays,recurrence 来源: https://codeday.me/bug/20190612/1224158.html