首页 > 解决方案 > Collat​​z Sequence:效率问题还是软件/硬件太慢?

问题描述

我认为已经找到了一个解决方案,可以找到低于 LIMIT 的最大 Collat​​z 序列,但这需要很多时间!我的问题真的是它的来源是:代码、软件、硬件?

我在 Internet 上进行了一些研究,并且看到人们以几乎相同的方式执行此操作,运行时间约为 2000 毫秒。而我的电脑甚至没有那么远!我正在使用 Visual Studio,C++。顺便说一句,经过调试可以看出,在确定113383的序列时,计算突然(停止,挣扎,挂断?)。

这是我的小代码片段:

(带有 map 的部分和第一个 if 是可能的补充,我认为可以加快整个过程,但没有。如果我把它们排除在外,它的速度是一样的)

#include <iostream>
#include <set>
#include <map>

using namespace std;

#define LIMIT 1234567

int main()
{
    int n = 0;
    int compare = 0;
    int longest = 0;
    int counter = 1;
    set <int> nums2excl;
    map <int, int> mappi;
    map <int, int>::const_iterator itMap = mappi.begin();

    for (int i = 13; i < LIMIT; i++)
    {
        if (nums2excl.find(i) != nums2excl.end())
        {
            continue;
        }

        n = i;

        while (n != 1)
        {
            itMap = mappi.find(n);
            if (itMap != mappi.end())
            {
                counter += ((*itMap).second - 1);
                break;
            }

            if (n % 2 == 0)
            {
                n /= 2;
            }
            else
            {
                n = 3 * n + 1;

                if (n > i)
                {
                    nums2excl.emplace(n);
                }
            }

            counter++;
        }

        mappi.emplace(i, counter);

        if (counter > compare)
        {
            compare = counter;
            longest = i;

            //Test
            cout << i << endl;
        }

        counter = 1; 
    }

    return 0;
}

现在,我是否遗漏了代码中的一些错误、效率方面的错误,还是我的笔记本电脑太慢了?

标签: c++visual-studiocollatz

解决方案


n 需要更大的数据类型,long long 解决了。


推荐阅读