Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;向量和内存化运行时错误问题_C++_Recursion_Vector_Runtime Error_Memoization - Fatal编程技术网

C++ C++;向量和内存化运行时错误问题

C++ C++;向量和内存化运行时错误问题,c++,recursion,vector,runtime-error,memoization,C++,Recursion,Vector,Runtime Error,Memoization,我在Codechef遇到了一个问题。我试着用一个向量来记忆。由于我还是编程新手,对STL容器非常不熟悉,所以我使用了vector作为查找表。(不过,有人建议我使用map有助于解决这个问题) 所以,我的问题是,下面给出的解决方案是如何遇到运行时错误的。为了得到错误,我使用问题的边界值(100000000)作为输入。我的Netbeans IDE显示的错误消息是运行失败(退出值1,总时间:4s),输入为100000000。代码如下: #include <iostream> #include

我在Codechef遇到了一个问题。我试着用一个向量来记忆。由于我还是编程新手,对STL容器非常不熟悉,所以我使用了
vector
作为查找表。(不过,有人建议我使用
map
有助于解决这个问题)

所以,我的问题是,下面给出的解决方案是如何遇到运行时错误的。为了得到错误,我使用问题的边界值(
100000000
)作为输入。我的Netbeans IDE显示的错误消息是
运行失败(退出值1,总时间:4s)
,输入为
100000000
。代码如下:

#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>

#define LCM 12
#define MAXSIZE 100000000
using namespace std;
/*
 * 
 */
vector<unsigned long> lookup(MAXSIZE,0);

int solve(int n)
{
    if ( n < 12) {
        return n;
    }
    else {
        if (n < MAXSIZE)  {
            if (lookup[n] != 0) {
                return lookup[n];
            }
        }

            int temp = solve(n/2)+solve(n/3)+solve(n/4);
            if (temp >= lookup[n] ) {
                lookup[n] = temp;
            }
            return lookup[n];

    }
}
int main(int argc, char** argv) {
    int t;
    cin>>t;
    int n;
    n = solve(t);
    if ( t >= n) {
        cout<<t<<endl;
    }
    else {
        cout<<n<<endl;
    }
    return 0;
}
#包括
#包括
#包括
#包括
#定义LCM 12
#定义MAXSIZE 100000000
使用名称空间std;
/*
* 
*/
向量查找(MAXSIZE,0);
整数解算(整数n)
{
if(n<12){
返回n;
}
否则{
如果(n=查找[n]){
查找[n]=温度;
}
返回查找[n];
}
}
int main(int argc,字符**argv){
int t;
cin>>t;
int n;
n=求解(t);
如果(t>=n){

你可能没有足够的内存,或者没有足够的连续地址空间来存储100000000个无符号长字符。

我怀疑这是否是内存问题,因为他已经说过程序实际运行并且输入100000000个字符

一个我注意到的东西,如果你在查找一个[n],即使n=xMax(在这个精确的条件下)。因为C++使用0个索引向量,那么这个向量将超过矢量的1。

    if (n < MAXSIZE)  {
     ...
    }

        ...
        if (temp >= lookup[n] ) {
            lookup[n] = temp;
        }
        return lookup[n];
if(n=查找[n]){
查找[n]=温度;
}
返回查找[n];

我猜不出该算法在做什么,但我认为第一个“if”的右大括号}应该放低一些,您可能会在该边界条件上返回一个错误。

这主要是内存问题。对于向量,您需要连续内存分配[以便它能够保持其恒定时间查找的承诺].在您的情况下,使用8字节双精度,您基本上是请求您的计算机在单个块中为您提供大约762 mb的内存

我不知道你在解决哪一个问题,但看起来你在解决比特兰硬币。为此,最好使用地图,因为:

  • 在一个测试用例运行中,您通常不会存储所有100000000个用例的值。因此,您需要的是一种只为您实际要记忆的那些值分配内存的方法
  • 即使是这样,也不需要固定时间的查找。虽然std::map会加快程序的速度,但它使用树为您提供对数查找时间。并且它消除了连续使用762 mb的要求。762 mb不是什么大问题,但单个块中的期望值是

  • 因此,在您的情况下最好使用std::map。在您的情况下,实际上只要用
    std::map
    替换
    std::vector
    就可以了,因为
    map
    还具有
    []
    操作员访问权限[在大多数情况下,它应该].

    我认为向量的大小只有
    100000000
    。根据
    无符号长
    的大小,可能是400 MB或800 MB。谢谢,更正了。问题很可能是
    向量
    所需的连续地址空间不足。这可能是由于递归太多而导致堆栈溢出。使用调试程序以查看发生了什么。