【问题标题】:Project Euler 14(Collatz Conjecture), issue implementing cache in JavaProject Euler 14(Collat​​z 猜想),在 Java 中实现缓存的问题
【发布时间】:2014-01-12 17:13:58
【问题描述】:

我正在解决 Project Euler 问题,但我被困在第 14 位,我确实设法使用蛮力解决了它,问题指出: http://projecteuler.net/problem=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 个术语。虽然还没有被证明(Collat​​z Problem),但人们认为所有的起始数字都以 1 结束。

100 万以下的哪个起始数字产生最长的链?

注意:一旦链启动,条款允许超过一百万。

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

由于 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);


}
}

但它不起作用,我在哪里出错了?是不是因为 long to int 类型转换?

【问题讨论】:

  • Project Euler 明确要求人们不要在网上发布解决方案。
  • 我将删除工作解决方案,但我确实需要缓存方面的帮助。编辑:抱歉问菜鸟问题,问题的编辑按钮在哪里?
  • 对 PE 问题的强力回答,尤其是早期的问题,只需 google 搜索即可。我认为在此处删除您的蛮力解决方案并没有什么好处,但是如果您需要编辑帖子,“编辑”链接位于标签下方,标签位于问题本身下方。
  • 我不需要蛮力方面的帮助,凭借现代计算机的处理能力,几乎所有 2005 年之前的问题都可以轻松解决,但我试图找到一个即使在最慢的机器上也能运行的解决方案,不依赖于处理能力或高级库。

标签: java caching collatz


【解决方案1】:

在这一行:

counter=collatzCache[(int) number];

你用缓存值覆盖了计数器,因此失去了额外的链步骤。

【讨论】:

  • 杰克逊所说的。您正在删除链的当前长度并将其替换为缓存值。您需要将缓存中的内容添加到计数器的完整链长度。
  • 是的,就是这样,非常感谢,我犯了一个非常严重的错误,如果我继续犯这样的错误,天知道我将如何处理更复杂的问题。对于 ireeder 之前的评论,缓存在这里提供了极大的帮助:无缓存:540 毫秒 有缓存:40 毫秒 这几乎是 12 倍 的加速,这将有所帮助如果我要喂它说 1000 万个或更多的数字,那就太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多