C++ 基于向量搜索的加速算法的最佳方法是什么?

C++ 基于向量搜索的加速算法的最佳方法是什么?,c++,algorithm,vector,indexing,C++,Algorithm,Vector,Indexing,我正在努力解决这个问题 到目前为止,我想我成功地构建了一个算法来找到答案。或者至少它给出了前40步的正确结果。但我需要计算第10000000000步。求解前40步(使用我的算法)大约需要3-4秒。迭代次数越大,计算时间也越长。我不认为我的电脑能在一年内解决10000000000次迭代 我所做的只是使用临时向量进行序列数计数(form_1和form_2),并将计算结果保留在每次迭代的结果中(testVec)。下面是我的代码: #include <iostream> #include &

我正在努力解决这个问题

到目前为止,我想我成功地构建了一个算法来找到答案。或者至少它给出了前40步的正确结果。但我需要计算第10000000000步。求解前40步(使用我的算法)大约需要3-4秒。迭代次数越大,计算时间也越长。我不认为我的电脑能在一年内解决10000000000次迭代

我所做的只是使用临时向量进行序列数计数(form_1和form_2),并将计算结果保留在每次迭代的结果中(testVec)。下面是我的代码:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <cmath>

std::vector<int> form_1;
std::vector<int> form_2;
std::vector<int> testVec;

void showVec(std::vector<int>& vec)
{
    //
    for (unsigned long int i = 0; i < vec.size(); i++)
    {
        //
        std::cout << vec[i] << std::endl;
    }
}

void resFin(int start, int stop, std::vector<int>& vec)
{
    //
    for (unsigned long int i = 0; i < vec.size(); i++)
    {
        //
        if (i == 0)
        {
            //
            form_1.push_back(vec[0]);
            //std::cout << "form_1 pushed " << vec[0] << std::endl;
        }
        else
        {
            //
            if (i != vec.size() - 1)
            {
                //
                if (vec[i] == vec[i - 1])
                {
                    //
                    form_1.push_back(vec[i]);
                    //std::cout << "form_1 pushed " << vec[i] << std::endl;
                }
                else
                {
                    //
                    form_2.push_back(form_1.size());
                    form_2.push_back(vec[i - 1]);
                    form_1.clear();
                    form_1.push_back(vec[i]);
                }
            }
            else
            {
                //
                if (vec[i] == vec[i - 1])
                {
                    //
                    form_1.push_back(vec[i]);
                    //std::cout << "form_1 pushed " << vec[i] << std::endl;
                    form_2.push_back(form_1.size());
                    //std::cout << "form_2 pushed " << form_1.size() << std::endl;
                    form_2.push_back(vec[i - 1]);
                    //std::cout << "form_2 pushed " << vec[i - 1] << std::endl;
                    form_1.clear();
                }
                else
                {
                    //
                    form_2.push_back(form_1.size());
                    //std::cout << "form_2 pushed " << form_1.size() << std::endl;
                    form_2.push_back(vec[i - 1]);
                    //std::cout << "form_2 pushed " << vec[i - 1] << std::endl;
                    form_2.push_back(1);
                    //std::cout << "form_2 pushed " << 1 << std::endl;
                    form_2.push_back(vec[i]);
                    //std::cout << "form_2 pushed " << vec[i] << std::endl;
                    form_1.clear();
                }
            }
        }
    }
    vec.clear();
    for (unsigned long int k = 0; k < form_2.size(); k++)
    {
        //
        vec.push_back(form_2[k]);
        //std::cout << "vec pushed " << form_2[k] << std::endl;
    }
    //showVec(vec);
    if (start + 1 != stop)
    {
        //
        form_1.clear();
        form_2.clear();
        std::cout << "recursed to " << start + 1 << std::endl;
        resFin(start + 1, stop, vec);
    }
}

void stepFind(int stop, std::vector<int>& vec)
{
    //
    resFin(1, stop, vec);
}

void trimmVec(std::vector<int>& vec)
{
    //
    int a = 0;
    int b = 0;
    int c = 0;

    for (unsigned long int i = 0; i < vec.size(); i ++)
    {
        //
        switch (vec[i])
        {
        case 1:
            a++;
            a = a % 1073741824;
            break;
        case 2:
            b++;
            b = b % 1073741824;
            break;
        case 3:
            c++;
            c = c % 1073741824;
            break;
        default:
            break;
        }
    }
    std::cout << "a is " << a << "; b is " << b << "; c is " << c << std::endl;
}

int main()
{
    //
    testVec.push_back(1);
    testVec.push_back(1);
    stepFind(39, testVec);
    //showVec(testVec);
    trimmVec(testVec);
    getchar();
    return 0;
}
#包括
#包括
#包括
#包括
std::向量形式_1;
std::向量形式_2;
std::向量testVec;
void showVec(标准::向量和向量)
{
//
for(无符号长整数i=0;i到目前为止,我想我成功地建立了一个算法来找到答案——也许你需要一个不同的算法。真的吗?伙计,我花了很多小时才想出这个算法。如果这是垃圾,我会被彻底摧毁。你认为这个算法不好吗?这些在线编码网站的一个诀窍是,总是有一个已知的算法是ou你应该使用的是什么?如果你提出自己的算法,几乎总是错误的选择。这很难理解。如何在网上搜索特定的算法?我想不出哪怕是一个关键字?!要么是一个算法,要么是一个更快查找、插入等的更好、更高效的数据结构,例如
std::map
或哈希表。