我有一个用于背包问题的动态规划算法,使用的是C++语言。当它被实现为函数并访问传递给它的变量时,在特定情况下运行需要22秒。但是,当我将其作为类KnapsackInstance的成员函数,并使用该类的数据成员作为变量时,运行时间却增加到了37秒。据我所知,只有访问成员函数才会经过虚表(vtable),因此我无法解释可能发生的情况。
以下是该函数的代码:
这是在Debian Lenny上运行的,使用了g++-4.3.2和-O3 -DNDEBUG参数。
谢谢。
以下是该函数的代码:
int KnapsackInstance::dpSolve() {
int i; // Current item number
int d; // Current weight
int * tbl; // Array of size weightLeft
int toret;
tbl = new int[weightLeft+1];
if (!tbl) return -1;
memset(tbl, 0, (weightLeft+1)*sizeof(int));
for (i = 1; i <= numItems; ++i) {
for (d = weightLeft; d >= 0; --d) {
if (profitsWeights.at(i-1).second <= d) {
/* Either add this item or don't */
int v1 = profitsWeights.at(i-1).first + tbl[d-profitsWeights.at(i-1).second];
int v2 = tbl[d];
tbl[d] = (v1 < v2 ? v2 : v1);
}
}
}
toret = tbl[weightLeft];
delete[] tbl;
return toret;
}
tbl是DP表的一列。我们从第一列开始,一直到最后一列。profitsWeights变量是一对向量,第一个元素是利润,第二个元素是重量。toret是要返回的值。
以下是原始函数的代码:
int dpSolve(vector<pair<int, int> > profitsWeights, int weightLeft, int numItems) {
int i; // Current item number
int d; // Current weight
int * tbl; // Array of size weightLeft
int toret;
tbl = new int[weightLeft+1];
if (!tbl) return -1;
memset(tbl, 0, (weightLeft+1)*sizeof(int));
for (i = 1; i <= numItems; ++i) {
for (d = weightLeft; d >= 0; --d) {
if (profitsWeights.at(i-1).second <= d) {
/* Either add this item or don't */
int v1 = profitsWeights.at(i-1).first + tbl[d-profitsWeights.at(i-1).second];
int v2 = tbl[d];
tbl[d] = (v1 < v2 ? v2 : v1);
}
}
}
toret = tbl[weightLeft];
delete[] tbl;
return toret;
}
这是在Debian Lenny上运行的,使用了g++-4.3.2和-O3 -DNDEBUG参数。
谢谢。
delete[] tbl
不会被调用。 - Travis Gockel