【问题标题】:C++ vector and memoization runtime error issuesC++ 矢量和记忆运行时错误问题
【发布时间】:2012-01-27 06:50:55
【问题描述】:

我在 Codechef 遇到了问题here。我正在尝试使用向量进行记忆。由于我还是编程新手,而且对 STL 容器非常陌生,因此我使用了vector 作为查找表。 (尽管有人建议我使用map 有助于解决问题)。

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

#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;
}

【问题讨论】:

  • 这可能是你递归太多并得到堆栈溢出。使用调试器看看会发生什么。

标签: c++ recursion vector runtime-error memoization


【解决方案1】:

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

我注意到的一件事是,在 if 条件下,即使 n == MAXSIZE(在此确切条件下),您也在进行查找 [n]。由于 C++ 使用 0-indexed 向量,所以这将是 1 超出向量的末尾。

    if (n < MAXSIZE)  {
     ...
    }

        ...
        if (temp >= lookup[n] ) {
            lookup[n] = temp;
        }
        return lookup[n];

我无法猜测算法在做什么,但我认为第一个“if”的右大括号 } 应该更低,并且您可能会在此边界条件下返回错误。

【讨论】:

    【解决方案2】:

    您要么没有足够的内存,要么没有足够的连续地址空间来存储 100,000,000 unsigned longs。

    【讨论】:

    • 我认为向量的大小只有100,000,000。这将是 400 MB 或 800 MB,具体取决于 unsigned long 的大小。
    • 谢谢,已更正。问题很可能是缺少vector 需要的连续 地址空间。
    【解决方案3】:

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

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

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

    因此,在您的情况下最好使用 std::map。在您的情况下,实际上只需将std::vector&lt;unsigned long&gt; 替换为std::map&lt;int, unsigned long&gt; 即可,因为map 也具有[] 操作员访问权限[在大多数情况下,它应该]。

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 2017-03-14
      • 2023-02-04
      • 2019-06-13
      • 1970-01-01
      相关资源
      最近更新 更多