c++ - Collatz Sequence:效率问题还是软件/硬件太慢?
问题描述
我认为已经找到了一个解决方案,可以找到低于 LIMIT 的最大 Collatz 序列,但这需要很多时间!我的问题真的是它的来源是:代码、软件、硬件?
我在 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;
}
现在,我是否遗漏了代码中的一些错误、效率方面的错误,还是我的笔记本电脑太慢了?
解决方案
n 需要更大的数据类型,long long 解决了。
推荐阅读
- php - 如何在 PHPSpreadsheet 中获取命名范围
- sql - 如果值为 NULL,则左连接,否则为内连接
- ios - “self.pushViewController”在 Swift4 中不起作用
- ibm-cloud - IBM Voice Agent RTP 端口范围
- bash - 查找 1 小时前创建的文件
- python - 在极坐标中显示
- database - 如何在 Flutter 中构建动态字符串列表?
- php - Safari - 注意:试图获取非对象的属性... post-template.php 在第 656 行
- javascript - 对于在 html 中使用 iframe 循环,Spotify 播放按钮
- r - 为什么R在使用“which()”比较两个数据集时找不到“NA”