簡體   English   中英

C ++向量和備忘錄運行時錯誤問題

[英]C++ vector and memoization runtime error issues

我遇到一個問題在這里的Codechef。 我正在嘗試使用向量進行記憶。 由於我仍然是編程新手,並且對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;
}

我懷疑這是否是內存問題,因為他已經說過該程序實際上在運行,並且他輸入了100000000。

我注意到的一件事,在if條件下,即使n == MAXSIZE(在此精確條件下),您也要執行lookup [n]。 由於C ++使用索引為0的向量,因此該向量將比向量的末尾多1。

    if (n < MAXSIZE)  {
     ...
    }

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

我猜不出算法在做什么,但是我認為第一個“ if”的右括號應降低,並且您可能會在此邊界條件下返回錯誤。

您要么沒有足夠的內存,要么沒有足夠的連續地址空間來存儲100,000,000個unsigned long s。

這主要是內存問題。 對於矢量,您需要連續的內存分配[以便可以跟上其恆定時間查找的承諾]。 對於您的情況,使用8字節的雙字節,您基本上是在要求您的計算機在單個塊中提供大約762 mb的內存。

我不知道您要解決哪個問題,但看起來您正在解決Bytelandian硬幣。 為此,最好使用地圖,因為:

  1. 您幾乎不會在測試用例運行中存儲所有100000000個用例的值。 因此,您需要的是一種僅為您實際記住的值分配內存的方法。
  2. 即使您是,也無需進行恆定時間查找。 盡管它可以加快程序運行速度,但std :: map使用樹為您提供對數查找時間。 而且它消除了連續使用762 mb的需求。 762 mb沒什么大不了的,但是期望在單個塊中是。

因此,在您的情況下最好使用的是std :: map。 在您的情況下,實際上只需將std::vector<unsigned long>替換為std::map<int, unsigned long> ,因為map也具有[]操作員訪問權限[在大多數情況下,應該如此]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM