Euler14项目(Collatz猜想),在Java中实现缓存的问题

Euler14项目(Collatz猜想),在Java中实现缓存的问题,java,caching,collatz,Java,Caching,Collatz,我在解决Euler项目的问题,我被困在了第14位,我确实用蛮力解决了它,问题是: 为正整数集定义以下迭代序列: n → n/2 (n is even) n → 3n + 1 (n is odd) 使用上述规则并从13开始,我们生成以下序列: 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 可以看出,这个序列(从13开始到1结束)包含10个术语。虽然还没有被证明(科拉兹问题),但人们认为所有的起始数字都以1结束 哪一个起始数字,在一百万

我在解决Euler项目的问题,我被困在了第14位,我确实用蛮力解决了它,问题是:

为正整数集定义以下迭代序列:

   n → n/2 (n is even)
   n → 3n + 1 (n is odd)
使用上述规则并从13开始,我们生成以下序列:

   13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
可以看出,这个序列(从13开始到1结束)包含10个术语。虽然还没有被证明(科拉兹问题),但人们认为所有的起始数字都以1结束

哪一个起始数字,在一百万以下,产生的链条最长

注:一旦链开始,条款允许超过一百万

我想做的是实现一个缓存,我想使用一个整数数组作为缓存,索引将是数字,存储在每个单元格中的计数将是链的长度,当我们命中一个缓存单元格已经有正数的数字时,我们跳过进一步的检查(打破循环),从循环中获取现有计数器数据,并将其添加到当前计数器值,然后从下一个数字开始,下面是实现:

由于Project Euler策略,工作暴力代码被删除,下面是错误代码。

public class Challenge14 {

public static void main(String[] args) {
    
    int[] collatzCache=new int[1000000]; //cache
    
    int count=0;
    long maxCount=0;
    int maxNumber=0;
    long number;
    
    int limit=1000000;
    
    for(int i=0;i<limit;i++)
    {
        int counter=0;
        number=i;
        while(number>1)
        {
            if(number%2==0)
            {
                number=number/2;
            }
            else 
            {
                number=3*number+1;
            }

            if(number<limit && collatzCache[(int)number]>0) //check
            {
                counter=collatzCache[(int) number];
                break;
            }
            counter++;
        }
        count=counter+1;
        collatzCache[i]=count;
    if(count>maxCount)
    {
        maxCount=count;
        maxNumber=i;
    }
    }
    System.out.println(maxNumber);


}
}
公共类挑战14{
公共静态void main(字符串[]args){
int[]collatzCache=new int[1000000];//缓存
整数计数=0;
长最大计数=0;
int maxNumber=0;
长数;
整数限制=1000000;
对于(int i=0;i1)
{
如果(数字%2==0)
{
数量=数量/2;
}
其他的
{
数字=3*数字+1;
}
if(number0)//检查
{
计数器=collatzCache[(int)编号];
打破
}
计数器++;
}
计数=计数器+1;
collatzCache[i]=计数;
如果(计数>最大计数)
{
最大计数=计数;
maxNumber=i;
}
}
System.out.println(maxNumber);
}
}
但它不起作用,我哪里出了问题?这是因为从长到整数的类型转换吗?

在这一行:

counter=collatzCache[(int) number];

您用缓存值覆盖了计数器中的内容,因此丢失了额外的链步骤。

Project Euler明确要求人们不要在线发布解决方案。我会删除工作解决方案,但我确实需要缓存方面的帮助。编辑:很抱歉问noob问题,问题的编辑按钮在哪里?PE问题的强力答案,特别是早期问题,只需谷歌搜索即可。我认为删除你的暴力解决方案没有什么好处,但是如果你需要编辑一篇文章,“编辑”链接就在标签下面,标签就在问题的下方。我不需要暴力方面的帮助,现代计算机的处理能力几乎可以轻松解决2005年之前的所有问题,但我试图找到一种即使在最慢的机器上也能运行的解决方案,而不依赖于处理能力或高级库。您正在删除链的当前长度,并将其替换为缓存值。你需要将缓存中的内容添加到整个链长度的计数器中。是的,就是这样,非常感谢,我犯了一个非常严重的错误,天知道如果我继续犯这样的错误,我以后将如何处理更复杂的问题。对于Ireder之前的评论,缓存在这里起了很大的作用:没有缓存:540ms,有缓存:40ms这是近12倍的加速,如果我给它输入1000万或更多的数据,这将非常有帮助。