我该怎么做才能使大整数的计数限制花费太多时间?
How can i do that counting limits take too much time for big integers?
我是 Vladimir Grygov,我遇到了非常严重的问题。
在我们的工作中,我们现在正在研究非常困难的算法,它使用限制来计算特定结果。
算法非常繁重,经过两个月的工作,我们发现了非常严重的问题。我们的分析团队告诉我要解决这个问题。
首先我告诉你这个问题,必须用极限来解决:
我们在数据库中有很多数据。 ECINT_MAX。
对于每个数据,我们必须通过算法将它们分为两组,一组必须有红色解释,第二组必须是蓝色。
算法使用 ID 字段进行计数,这是一些 AUTO_INCREMENT 值。对于这个值,我们检查这个值是否等于 1。如果是,则这是红色数据。如果为零,则为蓝色数据。如果是更多的话。然后一个,你必须减去数字 2 并再次检查。
经过大量的头脑风暴,我们选择了for循环的方法,但是对于更大的数字来说,这真的很慢。所以我们想删除循环,我的同事告诉我使用递归。
我这样做了。但是......在实施之后我得到了大整数的未知错误,例如long long int并且在他之后写道:"Stack Overflow Exception"
由此我决定写在这里,因为IDE告诉我这个页面的名称,所以我认为这里可能是答案。
非常感谢。你们所有人。
经过你的评论我觉得我可以解决它:
public bool isRed(long long val) {
if (val==1)
{return true; }
else if (val==0)
{ return false; }
else { return isRed(val - 2); }
}
val 的任何半途而废的值都会轻易打破这一点。这不可能与递归一起工作。否 CPU 将支持堆栈跟踪 接近 到一半 long.MaxInt!
但是您的代码存在一些普遍问题:
- 现在这是有史以来最复杂的 "is the number even" 检查。大多数人使用 Modulo 来解决这个问题。
if(val%2 == 0) return false; else return true;
- long long 类型似乎不正确。你重复了类型吗?您是要使用 BigInteger 吗?
如果你减去的值不是静态的并且不能通过模求解,那么这里没有理由不使用循环。
public bool isRed (long long val){
for(;val >= 0; val = val -2){
if(value == 0)
return false;
}
return true;
}
我是 Vladimir Grygov,我遇到了非常严重的问题。
在我们的工作中,我们现在正在研究非常困难的算法,它使用限制来计算特定结果。
算法非常繁重,经过两个月的工作,我们发现了非常严重的问题。我们的分析团队告诉我要解决这个问题。
首先我告诉你这个问题,必须用极限来解决: 我们在数据库中有很多数据。 ECINT_MAX。 对于每个数据,我们必须通过算法将它们分为两组,一组必须有红色解释,第二组必须是蓝色。
算法使用 ID 字段进行计数,这是一些 AUTO_INCREMENT 值。对于这个值,我们检查这个值是否等于 1。如果是,则这是红色数据。如果为零,则为蓝色数据。如果是更多的话。然后一个,你必须减去数字 2 并再次检查。
经过大量的头脑风暴,我们选择了for循环的方法,但是对于更大的数字来说,这真的很慢。所以我们想删除循环,我的同事告诉我使用递归。
我这样做了。但是......在实施之后我得到了大整数的未知错误,例如long long int并且在他之后写道:"Stack Overflow Exception"
由此我决定写在这里,因为IDE告诉我这个页面的名称,所以我认为这里可能是答案。
非常感谢。你们所有人。
经过你的评论我觉得我可以解决它:
public bool isRed(long long val) {
if (val==1)
{return true; }
else if (val==0)
{ return false; }
else { return isRed(val - 2); }
}
val 的任何半途而废的值都会轻易打破这一点。这不可能与递归一起工作。否 CPU 将支持堆栈跟踪 接近 到一半 long.MaxInt!
但是您的代码存在一些普遍问题:
- 现在这是有史以来最复杂的 "is the number even" 检查。大多数人使用 Modulo 来解决这个问题。
if(val%2 == 0) return false; else return true;
- long long 类型似乎不正确。你重复了类型吗?您是要使用 BigInteger 吗?
如果你减去的值不是静态的并且不能通过模求解,那么这里没有理由不使用循环。
public bool isRed (long long val){ for(;val >= 0; val = val -2){ if(value == 0) return false; } return true; }